有了之前的快速排序思路,不难发现这道题用快速排序可以很快地实现,只要排序后取前 k 个元素就好了,但是这样做也有点太浪费了,毕竟题目中并没有要求返回来的顺序是怎样的:以任意顺序返回这 k 个数均可。
从这点出发,我们可以尽量只放好前 k 个数的相对大小顺序,而快速排序也能完成这一点,也就是每次 partition 返回来的 mid ,如果大于 k ,说明前 k 个已经放好了相对顺序,那么就不需要管 [k, n] 的顺序怎么放了。
一直这么进行下去,直到地老天荒返回来的 mid 正好等于 k 时,说明前 k 个已经捡好了。
那么如果 mid < k ,说明还有剩余的元素在右半部分,这个时候就不需要管左边的子数组了,直接去右子数组找剩下的 k - mid + 1 个元素就好了,因为前 mid 个元素一定是需要的。