非递归分治法排序 MergeSort without recursion

一道作业题,网上没找到相关代码,就自己写了一个,比较有意思,经随机数10000规模测试通过。

 

关键在于合的时候找准“分点”

 

void Merge(int L, int R, int Mid, int A[], int Tmp[])
{
	int i, TmpIndex = L, LIndex = L, RIndex = Mid+1;

	while(LIndex <= Mid && RIndex <= R)
		Tmp[TmpIndex ++] = A[LIndex] <= A[RIndex] ? A[LIndex ++] : A[RIndex ++];

	while(LIndex <= Mid)
		Tmp[TmpIndex ++] = A[LIndex ++];
	while(RIndex <= R)
		Tmp[TmpIndex ++] = A[RIndex ++];

	for(i=L; i<=R; i++)
		A[i] = Tmp[i];
}

void MergeSort(int A[], int N)
{
	int *Tmp = (int *)malloc( N * sizeof(int) );
	int i, j, R, Mid;
	for(i=2; i<N; i <<= 1)
	{
		for(j=0; j<=N-1; j+=i)
		{
			Mid = j + (i>>1) - 1;
			if(j+i-1 > N-1) 
				R = N-1;
			else 
				R = j+i-1;
			Merge(j, R, Mid, A, Tmp);
		}
	}
	Merge(0, N-1, (i>>1)-1, A, Tmp);
	free(Tmp);
}

 

转载于:https://www.cnblogs.com/cjxa/archive/2010/10/07/1845118.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值