二路归并排序_2011_10_11

//二路归并排序
void myMerge(int R[], int R1[], int nLow, int nMid, int nHigh)
{
	int i = nLow;//原序列的开始位置
	int j = nMid + 1;//在原序列中有两条序列,这是后一条序列的起始位置
	int k = nLow;//这是将要放置比较后元素的序列

	while ((i <= nMid) && (j <= nHigh))
	{
		if (R[i] < R[j])//首先判断前面的序列的最小值是否小于后面序列的最小值,如果小于那么他就是整个两条序列中的最小值                                                    //当然你也可以设置为大于,那样就是逆序了
		{
			R1[k++] = R[i++];//将小于的元素赋值进新的辅助序列中
		} 
		else
		{
			R1[k++] = R[j++];//将小于的元素赋值进新的辅助序列中

		}
	}

	while (i <= nMid)
	{
		R1[k++] = R[i++];//因为有可能前面序列和后面序列是长度不等的,当比较完后,后面的序列早已是排完序的,只要赋值进辅助序列就好
	}
	while (j <= nHigh)
	{
		R1[k++] = R[j++];//因为有可能前面序列和后面序列是长度不等的,当比较完后,后面的序列早已是排完序的,只要赋值进辅助序列就好

	}
}


void myMergePass(int R[], int R1[], int nLength, int n)
{
	int i = 0;

	while ((i + 2 * nLength - 1) < n)//这种情况是刚好整个序列可以分为i = (n/nLength)  i = 1, 2, 3 ........整数
	{
		myMerge(R, R1, i, i + nLength - 1, i + 2 * nLength - 1);
		i = i + 2 * nLength;
	  
         //当中间元素大于或者等于或者小于时候分两种情况
	if ((i + nLength - 1) < (n - 1))//当中间元素小于n-1说明有2个序列并且后一个长度小于nLength..那为什么后面的长度小于nLength呢?//因为若if成立..必定[i, i + nLength - 1]是存在的..长度为nLength,但是[i + nLength - 1, i + 2 * nLength - 1]..因为上面的while已经包含了i + 2 * nLength = n - 1的情况..//所以只能用i + nLength - 1判断..那么 //i + nLength - 1 < n - 1...//i + 2 * nLength > n - 1时,必定[i + nLength - 1, n - 1]的值是要小于nLength的 //如果nLength = n-1时,那么就是只剩下一个前序列,如果大于那就是只有一个序列..因为这样 i < (n - 1)//那么到i到n - 1的距离肯定不够nLength..因为i + nLength - 1已经大于了n - 1
	{
		myMerge(R, R1, i, i + nLength, n - 1);
	} 
	else
	{
		for (int j = i; j < n; j++)//最后剩下的是已经排好序的前序列
		{
			R1[j] = R[j];
		}
	}
}


void myMergeSort(int R[], int n)
{
	int nLength = 1;

	int* nTempArray = new int[n];

	while (nLength < n)
	{
		myMergePass(R, nTempArray, nLength, n);
		nLength = 2 * nLength;

		myMergePass(nTempArray, R, nLength, n);
		nLength = 2 * nLength;
	}


	delete nTempArray;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值