排序(歸併,快速)
阿新 • • 發佈:2019-02-20
歸併排序
歸併就是不斷二分,然後在合併的時候排序 O(nlogn)
#include<bits/stdc++.h> using namespace std; int num[100],t[100]; void msort(int a, int b){ if(a == b) return; int mid = (a+b) >> 1; int l = a,r = mid + 1,k = b - a; msort(a,mid); msort(mid+1,b); for(int i = 0; i <= k; i ++){ if(l > mid){ t[i] = num[r ++]; continue; } if(r > b){ t[i] = num[l ++]; continue; } t[i] = num[r] > num[l] ? num[r++] : num[l++];//降序 //升序 t[i] = num[r] < num[l] ? num[r++] : num[l++]; } for(int i = 0; i <= k; i ++){ num[i + a] = t[i]; } } int main(){ int k; cin >> k; for(int i = 1; i <= k; i ++){ cin >> num[i]; } msort(1,k); for(int i = 1; i <= k; i ++){ cout << num[i] << " "; } return 0; }
快速排序
選定最左端的數,把比它小的放在左邊,比它大的放在右邊,返回這樣排序後的位置,然後在左邊範圍和右邊範圍繼續上述運算。模擬一下,一次的變化:
2為左端值 ,下標 i
2 3 4 1 5 ---3比2大位置不變(我們只改變比左端值小的)
2 3 4 1 5
2 1 3 4 5 ---1比2小 放到 i++位
2 1 3 4 5
迴圈結束後把左端值 替換到 i 位 :1 2 3 4 5
int partsort(int a,int b){ int k = a,p = num[a]; for(int i = a + 1; i <= b; i ++){ if(num[i] <= p){ swap(num[i],num[++k]); } } swap(num[k],num[a]); return k; } void quicksort(int a, int b){ if(a >= b) return; int k = partsort(a,b); quicksort(a,k-1); quicksort(k+1,b); }