代码如下:
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)
由于在做两个子数组归并时是稳定的,所以归并排序是稳定的排序