归并排序的实现

一.思想

归并排序是一种基于分治思想的经典排序算法。其主要思想可以总结为以下几个步骤:

  1. 分解(Divide): 将原始序列划分为若干子序列,直到每个子序列包含一个或零个元素,即认为这些子序列是有序的。

  2. 解决(Conquer): 对每个子序列进行递归排序。如果子序列的长度为1或零,那么它被认为是有序的。否则,对子序列递归应用归并排序。

  3. 合并(Merge): 将已排序的子序列合并为一个新的有序序列。这是通过比较每个子序列的头部元素,选择最小的元素放入新序列,然后将相应子序列的指针向后移动一步,直到所有的子序列都被合并为一个新序列。

一个简单的归并

二.实现

1.递归实现

复制代码
void _Merge(int* a, int* temp, int left, int right)//归并递归
{
	if (left >= right)
		return;
	int mid = (right + left) / 2;
	_Merge(a, temp, left, mid);
	_Merge(a, temp, mid+1, right);
	int begin1 = left, end1 = mid;
	int begin2 = mid + 1, end2 = right;
	int cout = left;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] <= a[begin2])
		{
			temp[cout++] = a[begin1];
			begin1++;
		}
		else
		{
			temp[cout++] = a[begin2];
			begin2++;
		}
	}
	while (begin1 <= end1)
	{
		temp[cout++] = a[begin1];
		begin1++;
	}
	while (begin2 <= end2)
	{
		temp[cout++] = a[begin2];
		begin2++;
	}
	memcpy(a+left, temp+left, (right - left + 1) * sizeof(int));
}
void MergeSort(int* a, int n)//归并
{
	int* temp = (int*)malloc(n * sizeof(int));
	assert(temp);
	_Merge(a, temp, 0, n-1);
	free(temp);
}

将每一段分到有序.再合并两个有序序列,从最小系列向上合并

注意temp数组拷贝回去的位置,

2.非递归

复制代码
void MergeNonRSort(int* a, int n)//归并排序非递归
{
	int* temp = (int*)malloc(n * sizeof(int));
	assert(temp);
	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;
			int cout = i;
			if (begin2 >= n)
				break;
			if (end2 >= n)
			{
				end2 = n - 1;
			}
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] <= a[begin2])
				{
					temp[cout++] = a[begin1];
					begin1++;
				}
				else
				{
					temp[cout++] = a[begin2];
					begin2++;
				}
			}
			while (begin1 <= end1)
			{
				temp[cout++] = a[begin1];
				begin1++;
			}
			while (begin2 <= end2)
			{
				temp[cout++] = a[begin2];
				begin2++;
			}
			memcpy(a + i, temp + i, (end2-i+1) * sizeof(int));
		}
		gap *= 2;
	}
	free(temp);
}

gap表示每一有序序列的元素个数,从最小的1个元素开始合并,两两合并

注意边界的取值,当第二个序列全越界,便需要再合并,只越界end就修正边界值

三.特点

1.优势:

  1. 稳定性: 归并排序是一种稳定的排序算法,即对于具有相等键值的元素,其相对顺序在排序后保持不变。

  2. 用于文件: 归并排序在对硬盘内的数据进行排序更方便,和其他排序结合可很好的对文件排序

2,缺点:

  1. 额外空间需求: 归并排序需要额外的内存空间来存储中间结果,这使得它在处理大规模数据时的空间复杂度较高。对于内存受限的环境,这可能是一个显著的缺点。

  2. 不适合小规模数据: 对于小规模的数据集,归并排序的性能可能不如一些简单的排序算法,

相关推荐
iAkuya9 分钟前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
近津薪荼9 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck11 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
松☆14 分钟前
CANN与大模型推理:在边缘端高效运行7B参数语言模型的实践指南
人工智能·算法·语言模型
java干货25 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
皮皮哎哟33 分钟前
数据结构:嵌入式常用排序与查找算法精讲
数据结构·算法·排序算法·二分查找·快速排序
程序员清洒41 分钟前
CANN模型剪枝:从敏感度感知到硬件稀疏加速的全链路压缩实战
算法·机器学习·剪枝
vortex51 小时前
几种 dump hash 方式对比分析
算法·哈希算法
堕2741 小时前
java数据结构当中的《排序》(一 )
java·数据结构·排序算法
2302_813806222 小时前
【嵌入式修炼:数据结构篇】——数据结构总结
数据结构