【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 }