算法绘本-归并排序

在了解归并排序之前,先了解一下分治法的思想。分治法就是将一个大的问题拆分成一个个小的问题,这些小问题拥有相同或相似的解决方法,将这些小问题逐个击破,最终达到解决大问题的思想,即“大而化小”的思想。

归并排序也是使用了分治法的思想,其原理是将给定的一组元素不停拆分,直到拆成单个的元素,然后将两两单个的元素比较归并成较小的元素组,再将这些元素组两两比较归并成更大的组,直到最后归并成一个组,得到排序后的元素。

举个例子,假设给定元素4,7,9,6,1,0,2

image-20240415204854305.png

首先将上面的元素拆分成两个部分,7个元素对半拆分成4,7,9,6和1,0,2两个部分

image-20240415205101367.png

然后再分别对这两个部分对半拆分,将4,7,9,6这部分拆分成4,7和9,6两个部分,将1,0,2这部分拆分成1,0和2两个部分

image-20240415205318126.png

同样的,将上面的4,7这部分拆成单独的4和7,将9,6这部分拆分成单独的9和6,将1,0这部分拆分成单独的1和0,2本身就是一个,无法再拆分了

image-20240415205539638.png

接下来,就是对上面的数字两两归并,即4和7排序归并成一组,9和6排序归并成一组,1和0排序归并成一组,2,2就单独一组吧。因为这里都是单个的数字比较,所以就直接比较归并了,归并后如下

image-20240415215332521.png

然后对前两个组再归并,这里定义一个数组,长度为4,用来存放归并后的值,定义j,k分别指向前两个组的下标0,定义p指向长度为4的数组的下标0

image-20240415215645464.png

首先比较j和k指向的数字4和6,因为4小于6,所以把4放到p指向的位置,然后把j和p向后移动一位

image-20240415215833281.png

再比较j和k指向的数字7和6,因为6比7小,所以将6放到p指向的位置,然后k和p向后移动一位

image-20240415215945374.png

再比较j和k指向的数字7和9,因为7比9小,所以将7放到p指向的位置,再将j和p向后移动一位

image-20240415220041492.png

这时候只剩下k指向的数字了,将k指向的数字9放到p指向的位置,前两个组的归并结束,得到排好序后一个组

image-20240415220231244.png

然后,对后两个组进行归并,定义一个数组,长度为3,用来存放归并后的值,定义j,k分别指向两个组的下标0,定义p指向长度为3的数组的下标0

image-20240415220305287.png

比较j和k指向的数字0和2,因为0小于2,所以将0放到p指向的位置,j和p向后移动一位

image-20240415220527851.png

再比较j和k指向的数字1和2,因为1比2小,所以将1放到p指向的位置,j和p向后移动一位

image-20240415220625461.png

这时候,只剩k指向的一个数字2了,将2放到p指向的位置,结束这次归并,得到排序后的一组数字

image-20240415220725081.png

现在所有的数字变成了各自有序的两组,再用同样的方法,定义一个数组,长度为7,用来存放归并后的值,定义j,k分别指向两个组的下标0,定义p指向长度为7的数组的下标0

image-20240415220843075.png

比较j和k指向的数字4和0,因为0小于4,所以将0放到p指向的位置,将k和p向后移动一位

image-20240415221231506.png

再比较j和k指向的数字4和1,因为1小于4,所以将1放到p指向的位置,k和p向后移动一位

image-20240415221328417.png

再比较j和k指向的数字4和2,因为2小于4,所以将2放到p指向的位置,k和p向后移动一位

image-20240415221404304.png

这时候后面的组中数字已经放完了,所以接下来的比较就是将前面的组中的数字依次放到长度为7的数字中,得到最终的排序结果

image-20240415221537780.png

总结
  • 在拆分的时候,需要将组对半拆分,拆分成logn层,归并的时候每层的运算量为n,所以归并排序的时间复杂度为O(nlogn)
  • 因为归并排序的时候最大需要n的空间,所以归并排序的空间复杂度为O(n)
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值