递归算法和非递归算法的核心代码相同,不同的只是排序的顺序的不同,递归算法一直往下分,分为两段且都从后一段开始排序,而非递归算法则是每大小一样的子表会进行排序结束后再进行子表的增大。
#include<iostream>
#include<cstring>
using namespace std;
int a[100000],t[100000];
int n;
void gbsort(int l,int r) //递归算法
{
if(l==r)
return;
int i,j,k,mid;
mid=(l+r)/2;
gbsort(l,mid);
gbsort(mid+1,r);
i=l;j=mid+1;k=l;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
t[k++]=a[i++];
else
t[k++]=a[j++];
}
while(i<=mid)
t[k++]=a[i++];
while(j<=r)
t[k++]=a[j++];
for(i=l;i<=r;i++)
a[i]=t[i];
}
int main(void)
{
ios::sync_with_stdio(0),cin.tie(0);
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
cin>>n;
int i,j,k;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
int l1,l2,r1,r2;
// gbsort(1,n); 递归算法
for(k=1;k<n;k*=2) //非递归算法
{
l1=1,r1=k,l2=1+k,r2=min(2*k,n);
while(l2<=n)
{
int i=l1,j=r1+1,q=l1;
while(i<=r1&&j<=r2)
{
if(a[i]<=a[j])
t[q++]=a[i++];
else
t[q++]=a[j++];
}
while(i<=r1)
t[q++]=a[i++];
while(j<=r2)
t[q++]=a[j++];
for(i=l1;i<=r2;i++)
a[i]=t[i];
l1+=2*k,r1+=2*k,l2+=2*k,r2=min(r2+2*k,n);
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
}
return 0;
}