关于归并排序
  • 板块学术版
  • 楼主Graph
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/16 19:29
  • 上次更新2023/11/2 13:24:55
查看原帖
关于归并排序
616996
Graph楼主2023/10/16 19:29

以这份代码为例:

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 ;
}

那么递归如同一颗二叉树,有 nlog⁡nn \log n 个节点,每次合并需要 O(n)O(n),那么,时间复杂度不是 O(n2log⁡n)O(n^2 \log n) 吗?但是实测是 O(nlog⁡n)O(n \log n),求助 dalao。

2023/10/16 19:29
加载中...