归并排序——动图+逐步讲解(C语言)

本文由博主Brant_zero分享,深入解析归并排序的递归与非递归实现。文章介绍了归并排序的基本思想,通过递归和迭代两种方式详细阐述了算法步骤,并针对非递归版本处理了越界问题,提供了两种修正方法。此外,还提醒读者注意归并排序中数组拷贝的细节,以及在实现过程中可能遇到的难点。

🔆欢迎来到我的【数据结构】专栏🔆

  • 👋我是Brant_zero,一名学习C/C++的在读大学生。
  • 🌏️我的博客主页​​​​​​➡➡Brant_zero的主页
  • 🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏

🍁前言

        在学习了堆排序、希尔排序、快速排序之后,我们再来学习一个同一量级的高效排序——插入排序。

        码字不易,如果感觉写的不错的话可以点点赞、留个言;下期准备出一个八大排序的代码合集版,方便查询,感兴趣的可以关注等待一波。如果有问题和错误可以在评论区提出,我必将及时回复。

目录

一、基本思想

二、归并排序(递归)

三、归并排序(非递归)

3.1 实现

3.2 越界处理


一、基本思想

归并排序( Merge-Sort )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法 的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
我们先来看看动态的排序过程是什么样的。

算法思路:

  1. 把数组从中间划分成两个子数组
  2. 一直递归地把子数组划分成更小的数组,直到子数组里面只有一个元素
  3. 依次按照递归的返回顺序,不断合并排好序的子数组,直到最后把整个数组顺序排好。

二、归并排序(递归)

不难发现,归并排序的递归过程十分类似于二叉树的后序遍历,先将区间分为左区间和右区间,划分到不能继续划分时,进行归并。

实习步骤:

  1. 创建一个临时数组,在临时数组中进行归并,防止归并时将原顺序打乱,整体归并完之后再将数据拷贝回原数组。
  2. 将区间划分为[begin , mid ] [mid+1,end]两段子区间,进行后序遍历递归,当划分到只有一个元素时返回。
  3. 进行归并。使用begin1和end1控制左区间,begin2和end2控制右区间,比较两个区间中的值将其插入到temp数组中,当其中一个区间归并结束时停止。
  4. 将未排完序的数组接着全放入temp数组中。
  5. 最后将temp中的值拷贝到原数组中。

void _MergeSort(int* a, int begin, int end, int* temp)
{
	if (begin >= end)
		return;
	//将区间分为左右两半
	int mid = (begin + end) / 2;
	//[begin,end]--->[begin , mid ] [mid+1,end]
	//开始递归拆开
	_MergeSort(a, begin, mid, temp);
	_MergeSort(a, mid+1, end, temp);

	//合并
	i
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值