1. 程式人生 > 實用技巧 >7.1 歸併排序

7.1 歸併排序

程式碼如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 /*
 5 注意,這裡有兩個優化點:
 6 一個是right,用的不是陣列末尾位置,而是尾後位置,這樣計算更簡單
 7 還有一個是添加了標記INT_MAX,這樣能夠省去一個邊界判定,讓程式碼看起來更強勢
 8 */
 9 static void merge(vector<int> &v, int left, int mid, int right){
10     int n1 = mid - left;
11     int n2 = right - mid;
12 vector<int> L(n1+1), R(n2+1); 13 for(int i=0;i<n1;i++) 14 L[i] = v[left+i]; 15 for(int i=0;i<n2;i++) 16 R[i] = v[mid+i]; 17 L[n1] = INT_MAX; 18 R[n2] = INT_MAX; 19 int i=0, j=0; 20 for(int k=left;k<right;k++){ 21 if(L[i] <= R[j]) 22
v[k] = L[i++]; 23 else 24 v[k] = R[j++]; 25 } 26 } 27 28 static void mergeSort(vector<int> &v,int left,int right){ 29 if(left+1 < right){ 30 int mid = left + ((right - left)>>1); 31 mergeSort(v, left, mid); 32 mergeSort(v, mid, right);
33 merge(v, left, mid, right); 34 } 35 } 36 37 int main(){ 38 int n; 39 while(cin>>n){ 40 vector<int> v(n); 41 for(int i=0;i<n;i++) 42 cin>>v[i]; 43 mergeSort(v, 0, n); 44 for(int num : v) 45 cout<<num<<","; 46 } 47 return 0; 48 }

歸併排序的時間複雜度O(nlogn)

由於在做兩個子陣列歸併時是穩定的,所以歸併排序是穩定的排序