不忘初心,砥砺前行
作者 | 陌无崖
转载请联系授权
导语
今天分享的是数组中寻找k个最小数的解题思路,分别是全部排序和部分排序,一起来看看吧~
题目要求
有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能的低。
解法一:利用全部排序
对于这种方法,我们只需要对我们的数组进行排序,然后取出前k个数就行了。那么对于全部排序,为了更加迅速我们使用快速排序的方法,因为快速排序的时间复杂度为O(nlogn),因此对于在n远大于k的情况下,此方法的时间复杂度为O(nlogn) + O(k) = O(nlogn),下面我们开始分析快速排序.
快速排序的思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序列。
听起来有点晦涩难懂,简单来说就是对于一个数组,我们随便找一个数字,将这个数字和其它数字进行比较,比它大的放右边,比它小的放左边。然后就分成了两个数组,通过同样的方法将其余的两个数组进行找数字,排序,每个数组又得到两个数组,一直循环通过以上的方式,最终一定会出现只包含两个数字的数组,因为已经排好序,并且小的一直放在右边,大的一直在左边,规并之后就是一个排好序的数组。
如果还不太明白,可以看下面的一张图篇:
排序流程
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值