C语言归并排序

定义

 

归并排序是高效的基于比较的稳定排序算法,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

 

动图演示

89e6a1562aa640e5b630f9440ad988a8.jpg

 

 

过程

 

合并:合并是归并排序的核心过程,即将两个有序数组合并为一个有序数组的过程。

 

假设存在有序数组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语言实现

 

20c1b294b16f41a095b05d248d84d52a.png

 

演示如下

1ac19268e8fe42ff95ccb45f2b53bf61.png

 

 

 

 

但是如果只能对有序数组排序,那这岂不太鸡肋了?别急,归并排序还有第二个过程。

分治

原理:

1.当数组长度为 1 时,该数组就已经是有序 的,不用再分解。

2.当数组长度大于 1 时,该数组很可能不是有序的。此时将该数组分为两段,再分别检查两个数组是否有序(用第 1 条)。如果有序,则将它们合并为一个有序数组;否则对不有序的数组重复第 2 条,再合并。

 

数学归纳法可以证明该流程可以将一个数组转变为有序数组。

 

为保证排序的复杂度,通常将数组分为尽量等长的两段M=(L+R)/2。

 

就像这样

 

fdc06bb5a0474e2ca4e16a4fd7066899.webp

 

代码实现

 

95cc865d1256409bbd11ede094dae7a1.png

 

当每个数组元素仅剩一个时,递归的过程就到头了,紧接着通过合并的函数对递归产生的数组进行排序。

 

注意两函数的参数对应关系,不然等你的可能就是调试的血与泪(╥﹏╥)…

 

实例如下:

 

1e12bb3a63e441d7a84a8d2cac79a9de.png

3047c079453d4d3898b71a9f76eff111.png 

 

总的而言,归并排序就是一个先分后合的过程

 

7cc70e72a7df44e59223f3fcf1e58de7.webp

 

正式这样的思想才保证了他的效率。

 

那么恭喜你又学会了一种新的高效的排序方法,快去通过实践熟练一下吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值