Merge Sort
Merge sort是典型的分治算法, 直接将原问题分为前一半和后一半。要使用分治算法,原问题必须能够分解为规模相当,且能够独立求解的两个子问题。Merge sort的算法框架可以套用在其它的分治算法上,只要把merge函数重写即可。
1 | def merge_sort(nums): |
Merge sort中的merge的办法可以应用到很多问题中。如
也是就是说,合并两个有序的线性结构,可以使用该merge算法。那如果是两个有序的二叉树呢(如 二分查找树)?可以这么来做。先通过该merge算法得到一个排好序的数组(时间复杂度为O(m+n)),然后再由该有序数组生成二分查找树(时间复杂度为O(m+n))。其中,m和n分别为两棵树的节点数。当然了,如果该二分查找树的表示方式为数组的话,那直接merge就完成了。
Quick Sort
Quick Sort也是分治算法。只是它分割子问题的方式相对巧妙一些。相比于merge sort,它不是直接将原数组分为前一半和后一半,而是随机选取一个元素,将原数组分为比这个元素大的一半和不比这个元素大的一半。它的好处是,把两个子问题的结果直接合并就是原问题的解。
我们还可以换一个角度来看这个排序的过程。当你把原数组分割好的时候,其实你也找到了那个分割元素在数组中的位置。
1 | def quick_sort(nums): |