非递归实现合并排序

来源:互联网 发布:linux kill命令详解 编辑:程序博客网 时间:2024/05/22 17:28
/*Subject:计算机算法设计与分析Title:2.7.2 非递归实现合并排序Coder: HaoClass:计科0906Num:0304090614Date:Sept 26th,2011 */#include <iostream>using namespace std;//用于合并的函数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;                 //设置计数器i,j,k   while((i<=m)&&(j<=r))         //当i<=m并且j<=m时   {   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];   }//用于排序的函数MergeSort//s为待合并数组段的长度,n为数组总长度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++;MergePass(b,a,s,n);s++;}}//用于合并排好序的相邻数组段MergePass//s为待合并数组段的长度,n为数组总长度template<class Type>void MergePass(Type a[],Type b[],int s,int n){//合并大小为s的相邻子数组int i=0;while(i<n-2*s){//合并大小为s的相邻2段子数组Merge(a,b,i,i+s-1,i+2*s-1);i=i+2*s;}//剩下的元素个数小于2sif(i+s<n) Merge(a,b, i, i+s-1, n-1);else for (int j=i;j<=n-1;j++) b[j]=a[j];}void main(){int n;         cout<<"非递归实现合并排序"<<endl<<"要排序的数组规模:";    cin>>n;    int *a=new int[n];    cout<<"输入要排序的数:"<<endl;         for(int i=0;i<n;i++)cin>>a[i];           //输入待排序数组           MergeSort(a,n);        cout<<"输出排好的数:"<<endl;       //输出排好序的数组    for(int i=0;i<n;i++)cout<<a[i]<<' ';     cout<<endl;    }

原创粉丝点击