• 归并排序的非递归实现


    首先归并排序的非递归和递归一样,都需要开辟一个数组为了进行更小的值的尾插,尾插结束后,再将这个有序数组拷贝到原数组中。

    在这里插入图片描述

    void MergeSortNonR(int* a, int n)
    {
    	// 首先归并排序的非递归和递归一样,都需要开辟一个数组为了进行更小的值的尾插,尾插结束后,再将这个有序数组拷贝到原数组中。
    	int* tmp = (int*)malloc(sizeof(int) * n);
    	if (tmp == NULL)
    	{
    		perror("malloc fail");
    		exit(-1);
    	}
    	
    	// 先将每次进行尾插时的左右区间的范围定为1
    	int rangeN = 1;
    	// 左右区间的范围肯定是不能大于数组的总大小了,当大于或者等于数组总大小时,循环结束。
    	// 并且这里也要注意,左右区间的的大小是不一定相同的,rangeN表示左右区间中最大区间的大小
    	// 把小于号改成小于等于号,也不会错,但是会多此一举,因为rangeN如果等于n了顺序一定全部排好了
    	// 在while循环中,rangeN循环一次它的大小就变为原来的两倍
    	while (rangeN < n)
    	{
    		// 每次循环排一组
    		for (int i = 0; i < n; i += rangeN * 2)
    		{
    			int begin1 = i, end1 = i + rangeN - 1;
    			int begin2 = i + rangeN, end2 = i + 2 * rangeN - 1;
    			int j = i;
    
    
    			// 可能存在数组越界的行为
    			// 有两种方法可以处理数组越界
    			// 第一种是改变区间的大小,这种方法可以适应后续的部分拷贝和全部拷贝
    			// 第二种方法是当区间大小不符合要求时,循环结束,此次rangeN的for循环结束
    			// 注意,第二种方法不支持后续的全部拷贝,因为后面的一部分区间没拷贝到tmp中,tmp中仍是随机值
    			if (end1 >= n)
    			{
    				break;
    			}
    			else if (begin2 >= n)
    			{
    				break;
    			}
    			else if (end2 >= n)
    			{
    				end2 = n - 1;
    			}
    			//if (end1 >= n)
    			//{
    			//	end1 = n - 1;
    			//	begin1 = n;
    			//	end2 = n - 1;
    			//}
    			//else if (begin2 >= n)
    			//{
    			//	end2 = n - 1;
    			//}
    			//else if (end2 >= n)
    			//{
    			//	end2 = n - 1;
    			//}
    			while (begin1 <= end1 && begin2 <= end2)
    			{
    				if (a[begin1] <= a[begin2])
    					tmp[j++] = a[begin1++];
    				else
    					tmp[j++] = a[begin2++];
    			}
    
    			while (begin1 <= end1)
    				tmp[j++] = a[begin1++];
    			while (begin2 <= end2)
    				tmp[j++] = a[begin2++];
    
    			memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));
    		}
    		//memcpy(a, tmp, sizeof(int) * n);
    
    		rangeN *= 2;
    	}
    
    
    	free(tmp);
    	tmp = NULL;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    企业面临的网络安全风险及应对策略
    node进程管理工具 pm2 常用操作命令
    【数据结构之单链表(超详解)】
    最新版GPT-4.5-Turbo简单介绍
    25期代码随想录算法训练营第十三天 | 栈与队列 part 2
    JS 高级
    短视频(批量剪辑+矩阵发布+爆款文案+无人直播)一体化营销工具
    智源AI日报(2022-08-26):当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
    分布式事务
    如何在 Windows 上安装 Docker Desktop
  • 原文地址:https://blog.csdn.net/m0_72940975/article/details/128193190