定义
归并排序是高效的基于比较的稳定排序算法,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
动图演示
过程
合并:合并是归并排序的核心过程,即将两个有序数组合并为一个有序数组的过程。
假设存在有序数组a[i]和b[i],将他们有序排入c[k]中。从左往右枚举 a[i] 和 b[j],找出最小的值并放入数组 c[k];重复上述过程直到 a[i] 和 b[j] 有一个为空时,将另一个数组剩下的元素放入 c[k]。
为保证排序的稳定性,前段首元素小于或等于后段首元素时(a[i] <= b[j])而非小于时(a[i] < b[j])就要作为最小值放入 c[k]。
C语言实现
演示如下
但是如果只能对有序数组排序,那这岂不太鸡肋了?别急,归并排序还有第二个过程。
分治
原理:
1.当数组长度为 1 时,该数组就已经是有序 的,不用再分解。
2.当数组长度大于 1 时,该数组很可能不是有序的。此时将该数组分为两段,再分别检查两个数组是否有序(用第 1 条)。如果有序,则将它们合并为一个有序数组;否则对不有序的数组重复第 2 条,再合并。
数学归纳法可以证明该流程可以将一个数组转变为有序数组。
为保证排序的复杂度,通常将数组分为尽量等长的两段M=(L+R)/2。
就像这样
代码实现
当每个数组元素仅剩一个时,递归的过程就到头了,紧接着通过合并的函数对递归产生的数组进行排序。
注意两函数的参数对应关系,不然等你的可能就是调试的血与泪(╥﹏╥)…
实例如下:
总的而言,归并排序就是一个先分后合的过程
正式这样的思想才保证了他的效率。
那么恭喜你又学会了一种新的高效的排序方法,快去通过实践熟练一下吧。