以这份代码为例:
void gib_unn(int L1,int R1,int L2,int R2)
{
int p1=L1,p2=L2,p3=0;
while(p1<=R1&&p2<=R2)
{
if(a[p1]<a[p2])
unn_tmp[++p3]=a[p1++];
else
unn_tmp[++p3]=a[p2++];
}
if(p1==R1+1)
for(int i=p2;i<=R2;i++)
unn_tmp[++p3]=a[i];
else if(p2==R2+1)
for(int i=p1;i<=R1;i++)
unn_tmp[++p3]=a[i];
for(int i=1;i<=p3;i++)
a[i+L1-1]=unn_tmp[i],unn_tmp[i]=0;
return ;
}
void gib_sort(int lt,int rt)
{
if(lt==rt)
return ;
int mid=(lt+rt)>>1;
gib_sort(lt,mid);
gib_sort(mid+1,rt);
gib_unn(lt,mid,mid+1,rt);
return ;
}
那么递归如同一颗二叉树,有 nlogn 个节点,每次合并需要 O(n),那么,时间复杂度不是 O(n2logn) 吗?但是实测是 O(nlogn),求助 dalao。