《我的第一本算法书》阅读笔记 2-6 归并排序

归并排序算法会把序列分成长度相同的两个子序列,当无法继续往下分时(也就是每个子序列中只有一个数据时),就对子序列进行归并。归并指的是把两个排好序的子序列合并成一个有序序列。该操作会一直重复执行,直到所有子序列都归并为一个整体为止。


首先,要把序列对半分割。

先分成两段……

再继续往下分……

分割完毕。接下来对分割后的元素进行合并。


把6和4合并,合并后的顺序为[4, 6]。

接下来把3和7合并,合并后的顺序为[3, 7]。

下面,我们来看看怎么合并 [4, 6]和[3, 7]。合并这种含有多个数字的子序列时,要先比较首位数字,再移动较小的数字。


由于4>3,所以移动3。

同样地,再次比较序列中剩下的首位数字。

由于4<7,所以移动4。

由于6<7,所以移动6。

最后移动剩下的7。

递归执行上面的操作,直到所有的数字都合为一个整体为止。


这里也要比较两个子序列中的首位数字。

由于3>1,所以移动1。继续操作……

合并完成,序列的排序也就完成了。


解说

归并排序中,分割序列所花费的时间不算在运行时间内(可以当作序列本来就是分 割好的)。在合并两个已排好序的子序列时,只需重复比较首位数据的大小,然后移动较 小的数据,因此只需花费和两个子序列的长度相应的运行时间。也就是说,完成一行归并所需的运行时间取决于这一行的数据量。

看一下上面的图便能得知,无论哪一行都是 n 个数据,所以每行的运行时间都为 O(n)。 而将长度为 n 的序列对半分割直到只有一个数据为止时,可以分成 行,因此,总共有 行。也就是说,总的运行时间为 O(nlogn),这与前面讲到的堆排序相同。

归并排序每次递归需要用到一个辅助表,长度与待排序的表相等,虽然递归次数是O(log2n),但每次递归都会释放掉所占的辅助空间,所以下次递归的栈空间和辅助空间与这部分释放的空间就不相关了,因而空间复杂度是O(n)。

《我的第一本算法书》 [日]石田保辉 宫崎修一/著 张贝/译

经验分享 程序员 微信小程序 职场和发展