非递归实现合并排序
来源:互联网 发布: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; }