归并排序个人理解

一、归并排序原理

归并排序的核心思想是分而治之,即将待排序的序列递归的分割成两半,直到每个子序列只剩下一个元素(即基本有序)。然后,再将这些基本有序的子序列两两合并,在合并过程中进行排序,最终到完全有序的序列。

二、归并排序实现步骤

1. 分割阶段(Divide) 递归地将待排序序列分割成两个长度近似相等的子序列,直到每个子序列只剩下一个元素。

2. 合并阶段(Merge) 合并两个已排序的子序列,生成一个新的有序序列。具体步骤如下:

初始化两个指针,分别指向两个子序列的起始位置。
比较两个指针所指向元素的大小,将较小者放入结果序列,并将对应的指针向前移动一位。
重复上述步骤,直到某一子序列遍历完毕,将另一子序列剩余元素直接复制到结果序列。
最终结果序列即为合并后的有序序列。

三、代码实现

#include<iostream>
using namespace std;

void CopyAr(int* cr, int* br,int left,int right)
{
	for (int i = left; i <= right; ++i)
	{
		br[i] = cr[i];
	}
}
void MergeAr(int* cr, int* br, int left, int m, int right)
{
	int i = left, j = m + 1;
	int k = left;
	while (i <= m && j <= right)
	{
		cr[k++] = br[i] < br[j] ? br[i++] : br[j++];
	}
	while (i <= m)
	{
		cr[k++] = br[i++];
	}
	while (j <= right)
	{
		cr[k++] = br[j++];
	}
}
void MergePass(int* cr, int* br, int left, int right)
{
	if (left < right)
	{
		int pos = (left + right) / 2;
		MergePass(cr, br, left, pos);
		MergePass(cr, br, pos + 1, right);
		MergeAr(cr, br, left, pos, right);
		CopyAr(cr, br, left,right);
	}
}
void MergeSort(int* br, int n)
{
	int* cr = (int*)malloc(sizeof(int) * n);
	if (nullptr == cr)
	{
		exit(1);
	}
	MergePass(cr, br, 0, n - 1);
	free(cr);
}
void Print(int* ar, int n)
{
	for (int i = 0; i < n; ++i)
	{
		cout << ar[i] << " ";
	}
	cout << endl;
}
int main()
{
	int ar[] = { 1,4,5,6,3,2,7,9,8 };
	int n = sizeof(ar) / sizeof(ar[0]);
	MergeSort(ar, n);
	Print(ar, n);
	return 0;
}

四、性能分析

时间复杂度: 归并排序的分割和合并操作各自的时间复杂度均为O(n),但由于递归调用的层数为log₂n,故总的时间复杂度为O(n log n)。这一时间复杂度在处理大规模数据时表现出色,且不受输入数据分布影响,始终保持稳定。

空间复杂度: 归并排序在合并阶段需要额外的空间存放合并后的有序序列,其空间复杂度为O(n)。尽管不是原地排序算法,但对于现代计算机系统来说,这一额外空间开销通常是可以接受的。

特点:

稳定:归并排序是稳定的排序算法,即相等元素的相对顺序在排序过程中不会改变。
适用于链表:由于归并排序无需原地操作,对于链表等非连续存储结构,其性能优于依赖于随机访问的排序算法。
优点:

高效:时间复杂度为O(n log n),在处理大规模数据时表现出色。
稳定:对稳定性有要求的场景中,归并排序是理想选择。
适应性强:不受输入数据分布影响,性能稳定。
缺点:

空间复杂度较高:需要额外的O(n)空间存放合并后的有序序列。
不适合小规模数据:对于非常小的数据集,其递归开销可能超过直接排序的成本。

五、应用场景

1. 大规模数据排序 归并排序在处理大规模数据时,其O(n log n)的时间复杂度具有显著优势,广泛应用于数据库、数据分析等领域的大规模数据排序任务。

2. 链表排序 对于链表等非连续存储结构,归并排序无需进行随机访问,可以高效地完成排序任务。

3. 稳定性要求高的场景 在排序结果要求相等元素保持原有相对顺序时,如成绩排名、员工工号排序等,归并排序是理想选择。

总结来说,归并排序凭借其分而治之的策略、O(n log n)的稳定时间复杂度以及优秀的稳定性,成为解决各类排序问题的强有力工具。尽管存在额外空间开销,但在处理大规模数据、链表排序以及对稳定性有要求的场景中,归并排序的优势尤为明显。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值