排序算法总结(二)归并法

来源:互联网 发布:js判断正则表达式 编辑:程序博客网 时间:2024/05/22 13:38

递归法

#include<iostream>using namespace std;void Merge(int r[],int r1[],int b,int m,int e){int i=b;int j=m+1;int k=b;while((i<=m)&&(j<=e)){if(r[i]<=r[j]){r1[k]=r[i];i++;k++;}else{r1[k]=r[j];j++;k++;}}if((i<=m)){while(i<=m){r1[k++]=r[i++];}}else if(j<=e){while(j<=e){r1[k++]=r[j++];}}}void MergeSort(int r[],int r1[],int s,int t){int r2[100];if (s==t){r1[s]=r[s];}else{int m=(s+t)/2;MergeSort(r,r2,s,m);MergeSort(r,r2,m+1,t);Merge(r2,r1,s,m,t);}}void main(){int a[7]={8,7,9,3,4,1,2};MergeSort(a,a,0,6);//递归调用 使得可以更新a值for(int i=0;i<7;i++){cout<<a[i]<<' ';}system("pause");}

非递归法

#include<iostream>using namespace std;void Merge(int r[],int r1[],int b,int m,int e){//一次归并int i=b,j=m+1,k=b;while((i<=m)&&(j<=e)){if(r[i]>=r[j]){r1[k++]=r[i++];}else{r1[k++]=r[j++];}}if(i<=m){while(i<=m)r1[k++]=r[i++];}else if(j<=e){while(j<=e)r1[k++]=r[j++];}}void MergePass(int r[],int r1[],int n,int h){//一趟排序int i=0;while(i<=n-2*h){Merge(r,r1,i,i+h-1,i+2*h-1);i=i+2*h;}if(i<n-h){Merge(r,r1,i,i+h-1,n-1);}else{for(int s=i;s<n;s++){r1[s]=r[s];}}}void MergeSort(int r[],int r1[],int n){int h=1;while(h<n){MergePass(r,r1,n,h);h=h*2;for(int i=0;i<n;i++){r[i]=r1[i];//更新序列值}}}void main(){int a[7]={8,7,9,4,1,2,3};int b[7];//非递归MergeSort(a,b,7);for(int i=0;i<7;i++){cout<<b[i]<<' ';}system("pause");}


0 0
原创粉丝点击