voidbubble_sort(){for(int i = n-1; i >=1; i --){bool flag = true;for(int j =1; j <= i; j ++)if(a[j-1]> a[j]){swap(a[j-1], a[j]);flag = false;}if(flag)return;}}
(2)選擇排序
voidselect_sort(){for(int i =0; i < n; i ++){int k = i;for(int j = i+1; j < n; j ++){if(a[j]< a[k])k = j;}swap(a[i], a[k]);}}
(3)插入排序
voidinsert_sort(){for(int i =1; i < n; i ++){int x = a[i];int j = i-1;while(j >=0&& x < a[j]){a[j+1]= a[j];j --;}a[j+1]= x;}}
(4)希爾排序
voidshell_sort(){for(int gap = n >>1; gap; gap >>=1){for(int i = gap; i < n; i ++){int x = a[i];int j;for(j = i; j >= gap && a[j-gap]> x; j -= gap)a[j]= a[j-gap];a[j]= x;}}}
intmaxbit(){int maxv = a[0];for(int i =1; i < n; i ++)if(maxv < a[i])maxv = a[i];int cnt =1;while(maxv >=10) maxv /=10, cnt ++;return cnt;}voidradixsort(){int t =maxbit();int radix =1;for(int i =1; i <= t; i ++){for(int j =0; j <10; j ++) count[j]=0;for(int j =0; j < n; j ++){int k =(a[j]/ radix)%10;count[k]++;}for(int j =1; j <10; j ++) count[j]+= count[j-1];for(int j = n-1; j >=0; j --){int k =(a[j]/ radix)%10;temp[count[k]-1]= a[j];count[k]--;}for(int j =0; j < n; j ++) a[j]= temp[j];radix *=10;}}
(8)堆排序
voiddown(int u){int t = u;if(u<<1<= n && h[u<<1]< h[t]) t = u<<1;if((u<<1|1)<= n && h[u<<1|1]< h[t]) t = u<<1|1;if(u != t){swap(h[u], h[t]);down(t);}}intmain(){for(int i =1; i <= n; i ++) cin >> h[i];for(int i = n/2; i; i --)down(i);while(true){if(!n)break;cout << h[1]<<' ';h[1]= h[n];n --;down(1);}return0;}
(9)計數排序
voidcounting_sort(){int sorted[N];int maxv = a[0];for(int i =1; i < n; i ++)if(maxv < a[i])maxv = a[i];int count[maxv+1];for(int i =0; i < n; i ++) count[a[i]]++;for(int i =1; i <= maxv; i ++) count[i]+= count[i-1];for(int i = n-1; i >=0; i --){sorted[count[a[i]]-1]= a[i];count[a[i]]--;}for(int i =0; i < n; i ++) a[i]= sorted[i];}
(10)桶排序(基數排序是桶排序的特例,優勢是可以處理浮點數和負數,劣勢是還要配合別的排序函數)
vector<int>bucketSort(vector<int>& nums){int n = nums.size();int maxv =*max_element(nums.begin(), nums.end());int minv =*min_element(nums.begin(), nums.end());int bs =1000;int m =(maxv-minv)/bs+1;vector<vector<int>>bucket(m);for(int i =0; i < n;++i){bucket[(nums[i]-minv)/bs].push_back(nums[i]);}int idx =0;for(int i =0; i < m;++i){int sz = bucket[i].size();bucket[i]=quickSort(bucket[i]);for(int j =0; j < sz;++j){nums[idx++]= bucket[i][j];}}return nums;}
1 快速排序
介紹:
快速排序在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他Ο(n log n) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的數據,可以決定設計的選擇,減少所需時間的二次方項之可能性。