代码如下:

 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)

由于在做两个子数组归并时是稳定的,所以归并排序是稳定的排序

posted on 2020-09-11 15:57  高数考了59  阅读(189)  评论(0)    收藏  举报