您的位置:首页 > 其它

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

2010-05-20 14:35 766 查看
合并排序算法是用分治策略实现对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
;

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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: