归并排序的非递归写法

归并排序的非递归写法

核心:

通过while循环控制gap

通过for循环控制归并的区间

但要注意begin2和end2,如果超过n-1的话就会将随机数拷贝到原数组中,从而引发报错。

 

通过调试可以发现报错是由于随机值引发的。 

void merge_sort_non(int* a, int n)
{
	int gap = 1;//每组数据的个数--->及刚开始一个一个归
	//int* tmp = new int[n];
	int* tmp = new int[n];
	while (gap < n)
	{
		for (int i = 0; i < n; i += 2 * gap)
		{
			//[i,i+gap-1][i+gap,i+2*gap-1]
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap , end2 = i + 2 * gap - 1;
			//归并过程中右半区间可能就不存在
			if (begin2 >= n)
			{
				break;//左边有序,右边没有就不需要归并了
			}
			//归并过程中右半区间算多了
			if (end2 >= n)
			{
				end2 = n - 1;
			}
			int index = i;//
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] < a[begin2])
				{
					tmp[index++] = a[begin1++];
				}
				else
				{
					tmp[index++] = a[begin2++];
				}
			}
			while (begin1 <= end1)
			{
				tmp[index++] = a[begin1++];
			}
			while (begin2 <= end2)
			{
				tmp[index++] = a[begin2++];
			}
			for (int j = i; j <= end2; ++j)//防止区间的左边存在问题
			{//归完之后立刻拷贝回去,防止将tmp中的随机值也考入a中
				a[j] = tmp[j];
			}
		}
		gap *= 2;
	}
	delete[] tmp;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值