归并排序算法之错误修正

本文探讨了归并排序中的二路归并思想,通过一个实例展示了算法过程,并指出了一处可能的错误:在MSort函数中直接对S进行排序和归并。修正方法是使用临时变量进行排序,避免原始数据被修改。最终展示了解决问题后的排序结果。
摘要由CSDN通过智能技术生成

归并排序:将两个或者两个以上的有序表合并成一个新的有序表,二路归并就是一组数组中前后相邻的两个有序序列归并为一个有序序列

二路归并的核心思想:假设有n个序列,然后两两归并,得到[n/2]个长度为2或者1的子序列;然后再两两归并,……,直至得到一个长度为n的有序序列为止

看下面2路归并算法的实例:

int MSort(MergeType S, MergeType *pT, int nStart, int nEnd)
{
	int nMidPos = 0;
	if ( !S.elem || nStart > nEnd)
	{
		return -1;
	}
	
	if (nStart == nEnd)
	{
		pT->elem[nStart] = S.elem[nStart];
		return 0;
	}

	nMidPos = (nStart + nEnd) / 2;
	MSort(S, pT, nStart, nMidPos);
	MSort(S, pT, nMidPos + 1, nEnd);
	Merge(S, pT, nStart, nMidPos, nEnd);

	return 0;
}

上面的步骤是将数据对半分割,直至只有一个数据,然后再进行归并,这是个递归的操作,看一下如何进行归并操作:

/*S:原数据列表,pT:排序好的数据列表,其他数据和函数定义请参考:冒泡算法的改进*/

</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值