归并排序的非递归写法

归并排序的非递归写法

核心:

通过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;
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-08 21:30:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-08 21:30:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-08 21:30:03       82 阅读
  4. Python语言-面向对象

    2024-04-08 21:30:03       91 阅读

热门阅读

  1. Qt实现Kermit协议(五)

    2024-04-08 21:30:03       37 阅读
  2. TypeScript学习文档(一)

    2024-04-08 21:30:03       28 阅读
  3. SHELL脚本编程训练1

    2024-04-08 21:30:03       34 阅读
  4. Spark产生小文件的原因及解决方案

    2024-04-08 21:30:03       35 阅读
  5. 多叉树先序遍历,LeetCode 1600. 王位继承顺序

    2024-04-08 21:30:03       36 阅读
  6. 【初识C语言】1

    2024-04-08 21:30:03       42 阅读
  7. GBase 8s Docker镜像说明

    2024-04-08 21:30:03       35 阅读
  8. Apache—POI详解、小案例展示

    2024-04-08 21:30:03       31 阅读
  9. C语言 超市商品(Goods) 销售 (Stock) 信息管理软件

    2024-04-08 21:30:03       29 阅读
  10. PgSQL的with as语法

    2024-04-08 21:30:03       39 阅读
  11. 【LeetCode热题100】【栈】柱状图中最大的矩形

    2024-04-08 21:30:03       28 阅读
  12. vscode配置vue + python

    2024-04-08 21:30:03       41 阅读
  13. Cisco Nexus 93180做为fex使用

    2024-04-08 21:30:03       37 阅读
  14. LeetCode 1600.王位继承顺序:深度优先搜索(DFS)

    2024-04-08 21:30:03       34 阅读
  15. Acwing2024蓝桥杯贡献法

    2024-04-08 21:30:03       31 阅读
  16. KVM基础管理命令

    2024-04-08 21:30:03       33 阅读