码迷,mamicode.com
首页 > 其他好文 > 详细

1111

时间:2015-06-28 14:10:36      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

 

哨兵实现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 }
技术分享

 不采用哨兵实现,需要考虑两个子数组在合并的过程中哪一个先合并结束,剩下的那个子数组剩下部分复制到数组中,程序实现如下:

1111

标签:

原文地址:http://www.cnblogs.com/littleKing163/p/4605435.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!