标签:
哨兵实现merge过程。在这个两种方法中都需要引入额外的辅助空间,用来存放即将合并的有序子数组,总的空间大小为n。现在用C语言完整实现这两种方法,程序如下:
1 //采用哨兵实现merge
2 #define MAXLIMIT 65535
3 void merge(int *datas,int p,int q,int r)
4 {
5 int n1 = q-p+1; //第一个有序子数组元素个数
6 int n2 = r-q; //第二个有序子数组元素个数
7 int *left = (int*)malloc(sizeof(int)*(n1+1));
8 int *right = (int*)malloc(sizeof(int)*(n2+1));
9 int i,j,k;
10 //将子数组复制到临时辅助空间
11 for(i=0;i<n1;++i)
12 left[i] = datas[p+i];
13 for(j=0;j<n2;++j)
14 right[j] = datas[q+j+1];
15 //添加哨兵
16 left[n1] = MAXLIMIT;
17 right[n2] = MAXLIMIT;
18 //从第一个元素开始合并
19 i = 0;
20 j = 0;
21 //开始合并
22 for(k=p;k<=r;k++)
23 {
24 if(left[i] < right[j])
25 {
26 datas[k] = left[i];
27 i++;
28 }
29 else
30 {
31 datas[k] = right[j];
32 j++;
33 }
34 }
35 free(left);
36 free(right);
37 }
不采用哨兵实现,需要考虑两个子数组在合并的过程中哪一个先合并结束,剩下的那个子数组剩下部分复制到数组中,程序实现如下:
标签:
原文地址:http://www.cnblogs.com/littleKing163/p/4605435.html