【Sort】Merge Sort归并排序

  归并排序运行时间O(N log N),但是由于需要线性附加内存,所以很少用于主存排序。

  算法核心在于以下三条语句,分治递归,分别对左半边和右半边的数组进行排序,然后把左右半边的数组一一进行比较放入数组

1         msort(nums,tmp,lp,center);
2         msort(nums,tmp,center+1,rp);
3         merge(nums,tmp,lp,center+1,rp);

下面是代码,主要包括三个函数:

 1 void mergesort(int *nums,int n)
 2 {
 3     int *tmp=new int[n];
 4     if(tmp)
 5     {
 6         msort(nums,tmp,0,n-1);
 7         delete[]tmp;
 8     }
 9 }
10 void msort(int *nums,int*tmp,int lp,int rp)
11 {
12     int center=(lp+rp)/2;
13     if(lp<rp)
14     {
15         msort(nums,tmp,lp,center);
16         msort(nums,tmp,center+1,rp);
17         merge(nums,tmp,lp,center+1,rp);
18     }
19 }
20 void merge(int *nums,int *tmp,int lp,int rp,int over)
21 {
22     int i=lp,j=rp,p=lp;
23     while(i<rp&&j<=over)
24     {
25         if(nums[i]<nums[j])
26             tmp[p++]=nums[i++];
27         else
28             tmp[p++]=nums[j++];
29     }
30     while(i<=rp-1)
31         tmp[p++]=nums[i++];
32     while(j<=over)
33         tmp[p++]=nums[j++];
34     while(lp<=over)
35     {
36         nums[lp]=tmp[lp];
37         lp++;
38     }
39 }

 

posted @ 2016-12-13 23:08  wilderness  阅读(230)  评论(0编辑  收藏  举报