🔆欢迎来到我的【数据结构】专栏🔆
- 👋我是Brant_zero,一名学习C/C++的在读大学生。
- 🌏️我的博客主页➡➡Brant_zero的主页
- 🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏
🍁前言
在学习了堆排序、希尔排序、快速排序之后,我们再来学习一个同一量级的高效排序——插入排序。
码字不易,如果感觉写的不错的话可以点点赞、留个言;下期准备出一个八大排序的代码合集版,方便查询,感兴趣的可以关注等待一波。如果有问题和错误可以在评论区提出,我必将及时回复。
目录
一、基本思想
归并排序( Merge-Sort )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法 的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
我们先来看看动态的排序过程是什么样的。

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

二、归并排序(递归)
不难发现,归并排序的递归过程十分类似于二叉树的后序遍历,先将区间分为左区间和右区间,划分到不能继续划分时,进行归并。
实习步骤:
- 创建一个临时数组,在临时数组中进行归并,防止归并时将原顺序打乱,整体归并完之后再将数据拷贝回原数组。
- 将区间划分为[begin , mid ] [mid+1,end]两段子区间,进行后序遍历递归,当划分到只有一个元素时返回。
- 进行归并。使用begin1和end1控制左区间,begin2和end2控制右区间,比较两个区间中的值将其插入到temp数组中,当其中一个区间归并结束时停止。
- 将未排完序的数组接着全放入temp数组中。
- 最后将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

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

被折叠的 条评论
为什么被折叠?



