排序算法:归并排序(非递归)

文章目录


先赞后看,养成习惯!!!^ _ ^<3 ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!
所属专栏:排序算法

一、非递归思路

步骤如下:
1.先两两归并,两个为一组
2.然后根据每组的距离gap,分配组数进行排序
3.gap每次扩大2的倍数
4.注意一些细节:首先注意可能会出现最后一组归并会发生数组的越界,因此我们所使用的方法是排完一组拷贝一组,出现越界的情况还要分情况讨论进行判断

如果begin2越界了,那这两组就不需要进行归并了
如果end2越界了,begin2没有越界,那么我们可以把end2修正成n-1,这样就可以两两归并了

细节图解:

二、代码演示

c 复制代码
void _MergeSort(int* a, int n,int* tmp)
{
	int gap = 1;
	while (gap < n)
	{
		for (int i = 0; i < n; i+=2*gap)
		{
			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 dex = i;

			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] > a[begin2])
					tmp[dex++] = a[begin2++];
				else
					tmp[dex++] = a[begin1++];
			}
			while (begin1 <= end1)
			{
				tmp[dex++] = a[begin1++];
			}

			while (begin2 <= end2)
			{
				tmp[dex++] = a[begin2++];
			}
			//排完一组拷贝一组
			memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));
		}
		gap *= 2;
	}
}


void MergeTest(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail");
		return;
	}
	//MergeSort(a, 0,n-1,tmp);
	_MergeSort(a,n,tmp);
}


int main()
{
	int a[11] = {3,5,2,1,6,7,9,8,10,11,4};
	MergeTest(a,sizeof(a)/sizeof(int));
	for (int i = 0; i < 11; i++)
		printf("%d ", a[i]);
	return 0;
}


相关推荐
IT猿手2 小时前
2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB
人工智能·python·算法·数学建模·matlab·智能优化算法
Dream it possible!5 小时前
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
c++·算法·leetcode
修己xj6 小时前
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
算法
开心比对错重要6 小时前
leetcode69.x 的平方根
数据结构·算法·leetcode
美狐美颜sdk7 小时前
什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解
人工智能·深度学习·算法·美颜sdk·第三方美颜sdk·视频美颜sdk·美颜api
m0_461502697 小时前
【贪心算法1】
算法·贪心算法
Doopny@7 小时前
数字组合(信息学奥赛一本通-1291)
数据结构·算法·动态规划
原来是猿8 小时前
蓝桥备赛(13)- 链表和 list(上)
开发语言·数据结构·c++·算法·链表·list
项目申报小狂人8 小时前
高性能算法NGO!北方苍鹰优化算法(Northern Goshawk Optimization,NGO)
算法·数学建模
且听风吟ayan8 小时前
leetcode day26 重复的子字符串
算法·leetcode·c#