2-路归并排序当时考研时在严书上看到的是递归算法,实际上可能非递归算法效率更高,现在把两者都写出来:
#include <iostream> #include<algorithm> using namespace std; const int maxn=101; int t[maxn]; void merge(int a[],int l1,int r1,int l2,int r2) { //将相邻两区间合并,l2=r1+1 int i=l1,j=l2,k=0; while(i<=r1&&j<=r2){ if(a[i]<=a[j]) t[k++]=a[i++]; else t[k++]=a[j++]; } while(i<=r1)t[k++]=a[i++]; while(j<=r2)t[k++]=a[j++]; for(int m=l1,f=0;m<=r2;) a[m++]=t[f++]; } void mergesort(int a[],int left,int right) { //递归实现 if(left<right){ int mid=(left+right)/2; mergesort(a,left,mid); mergesort(a,mid+1,right); merge(a,left,mid,mid+1,right); } } void mergesortnot(int a[],int n) { //非递归实现 for(int step=2;step/2<n;step*=2) { for(int i=0;i<n;i+=step) { int mid=i+step/2-1; if(mid+1<n) merge(a,i,mid,mid+1,min(i+step-1,n-1)); } } } int main(){ int a[6]={5,7,6,8,3,1}; mergesort(a,0,5); for(int i=0;i<6;i++) cout<<a[i]<<" "; cout<<endl; int b[6]={5,7,6,8,3,1}; mergesortnot(b,6); for(int i=0;i<6;i++) cout<<b[i]<<" "; cout<<endl; return 0; }
上述原理都在归并,不过递归是自上而下思考,非递归实现是自下向上思考