递归与分治策略-----合并排序

合并排序算法是用分治策略实现对n个元素进行排序的算法。

  基本思想:将带排序元素分成大小大致相同的两个子集合,分别对两个子集合进行合并排序,最终将排好序的子集合合并成所要求的的排好序的集合。

 

   递归算法:

      

      template <class Type> void MergeSort(Type a[],int left,int right) { if(left<right)//至少2个元素 { int i= (left+right)/2;//取中点 MergeSort(a,left,i); MergeSort(a,i,right); Merge(a,b,left,i,right);//合并到数组b Copy(a,b,left,right);//复制回数组a } }

 

   时间复杂度 T(n)=O(1)   n<=1; T(n)=2T(n/1)+O(n);

   T(n) = O(nlogn);

 

——————————————————————

改进后的非递归合并排序算法:

      基本思想:首先将数组a中相邻元素两两配对,用合并算法将它们排序,构成n/2组长度为2的有序的子数组段,然后再将它们排序成长度为4的有序子数组段,如此继续下去,直到整个数组排好序。

 

  template <class Type> void MergeSort(Type a[],int n) { Type * b = new Type[n]; int s=1; while(s < n) { MergePass(a,b,s,n);//合并大小为s的相邻子数组到数组b s +=s; MergePass(b,a,s,n);//合并到数组a s +=s; } } template <class Type> void MergePass(Type x[],Type y[],int s,int n) {//合并大小为s的相邻子数组 int i=0; while(i <= n – 2*s) { //合并大小为s的相邻2段子数组 Merge(x,y,i,i+s-1,i+2*s-1); i = i + 2*s; } //剩下的元素个数少于2s; if(i+s < n) Merge(x,y,i,i+s-1,n-1); else for(int j=i; j <=n-1;j++) y[j] = x[j]; } template <class Type> void Merge(Type c[],Type d[],int l,int m,int r) {//合并c[l:m]和c[m+1;r]到d[l:r]; int i=l,j = m+1;k=l; while((i<=m)&&(j<=r)) if(c[i]<c[j]) d[k++] = c[i++]; else d[k++] = c[j++]; if(i>m) for(int q=j;q<=r;q++) d[k++] = c[q]; else for(int q=i;q<=m;q++) d[k++] = c[q]; }

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/tjsinor2008/article/details/5611138
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞