C语言递归实现二路归并排序

二路归并意即需要将一个数组分成两个有序部分再归并,分成的两个部分再各自分成两个部分并有序化后再归并,如此往复直到最后每个部分只有1个元素,自然就有序了。这里,我们可以先将一个数组分为两个部分--左半部分,右半部分。两个部分都有序化后,用另一个函数连接这两个部分。这样,最终就实现了二路归并。

函数代码样例如下:其中,MergeSort是递归实现的,要调用子函数MergeArray,而MergeArray将两个有序数组按大小合并连接。注意标准库中有Merge函数,因此函数命名时不要命名为Merge。MergeSort中head tail顾名思义是数组的开始下标和结束下标,数组首元素从零开始。MergeArray中head1 tail1是左半部分待排序数组的头尾下标,head2 tail2是右半部分待排序数组头尾下标,实际上,head2=tail1+1但为了直观点还是将其写入了参数。由于排序时需要一个数组暂存,所以开辟一个数组空间,结束后销毁。这样比主函数定义一个辅助数组要干净利落一些。

int MergeSort(int a[],int head,int tail)
{
	int i=0,j=0;
	if(head<tail)
	{
		MergeSort(a,head,(head+tail)/2);
		MergeSort(a,(head+tail)/2+1,tail);
		MergeArray(a,head,(head+tail)/2,(head+tail)/2+1,tail);

	}
}

int MergeArray(int a[],int head1,int tail1,int head2,int tail2)
{
	int i=head1,j=head2,k=0;
	int *p&
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值