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;
}
上述原理都在归并,不过递归是自上而下思考,非递归实现是自下向上思考