从零开始学习算法之归并排序[1](2.2归并排序)

归并排序思想为将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素重复步骤2,直到所有元素排序完毕。

下列代码为单次归并的函数,可作为模板用于代码中。

PS:其中前段为第p位到第q位,后段为第q+1位到第r位。

 1 void Merge(int p,int q,int r){
 2     int n1 = q - p + 1;
 3     int n2 = r - q;
 4     long long L[n1],R[n2];
 5     for(int i = 0;i < n1;i++) L[i] = A[i+p];
 6     for(int i = 0;i < n2;i++) R[i] = A[i+q+1];
 7     L[n1] = 100000000;R[n2] = 100000000;
 8     int i = 0;int j = 0;
 9     for(int k = p;k <= r;k++){
10             if(L[i] < R[j]) A[k] = L[i++];
11             else A[k] = R[j++];
12     }
13 }

 加上排序完整代码如下,声明后只需Merge_sort(0,n)即可

 1 void Merge(int p,int q,int r)
 2 {
 3     int n1 = q - p + 1;
 4     int n2 = r - q;
 5     long long L[n1],R[n2];
 6     //将原数列分到两个数列
 7     for(int i = 0;i < n1;i++) L[i] = A[i+p];
 8     for(int i = 0;i < n2;i++) R[i] = A[i+q+1];
 9     L[n1] = 100000000;R[n2] = 100000000;//作为哨兵
10     int i = 0;int j = 0;
11     //接下来进行排序
12     for(int k = p;k <= r;k++){
13             if(L[i] < R[j]) A[k] = L[i++];
14             else A[k] = R[j++];
15     }
16 }
17 void Merge_sort(int p,int q)
18 {
19     int l;
20     if(p - q == 1) {
21             if(A[q] < A[p]){l = A[q];A[q] = A[p];A[p] = l;}}
22     else if(q - p) {
23             int center = (p + q) / 2;
24             Merge_sort(p,center);
25             Merge_sort(center + 1,q);
26             Merge(p,center,q);
27     }
28 }

*此代码中的A[]需为全局变量

posted @ 2017-10-24 18:44  Morizen  阅读(174)  评论(0)    收藏  举报