动机

最近时遇到一道"求最大的第K个数“,面试官一开始笑嘻嘻的说给到简单的题,但是即使在提示用类似快排的思想后仍然没有很好地写出来。除了现场写代码不够放松之外,最重要的我觉得还是对于递归算法的写法不够熟练。所以在这里借快排和归并排序两个例子来回顾下递归算法该怎么写。

快排与归并排序的区别

在写代码前先来理顺下这两种的排序方式的思想和区别很重要,快排的思想是在区间[i,j]内随机选取一个标兵pivot然后将比标兵小的放在左边,大的放在右边。之后重复对子区间进行相同的操作直到区间内元素的个数为1,也就是i == j。归并排序的思想是先将数组分成许多只有一个元素的小份,然后再把它们两两合并直到最后合成一个完整的排序好的数组。合并的前提是参与合并的两个数组都是有序的并且合并出来的数组也得是有序的。
在快排中真正“排序”的过程发生在将一个大的区间分为两个小的区间时,而归并排序则发生在将两个小区间合成为一个大区间。但两者都可以用递归的方式来实现。此外,由于快排中标兵的选取是随机的,如果标兵恰好选择了区间中最小的数,则快排的时间复杂度上升为 $O(n^2)$

const a = b;

蓝猫太胖飞不动
1 声望0 粉丝

front-end gogogo