题目:
求一个一维数组中最小的k个数。
解答:
方法一:排序
先把数组从小到大进行排序,取前k个数。
时间复杂度为O(nlogn)
方法二:使用堆排序
- 创建一个最小堆,初始化大小为k,堆顶为堆的最大元素;
- 扫描一遍数组,往最小堆插入数据,如果堆的元素个数已经达到k,那么新元素需要和堆顶比较,如果小于堆顶,则移除堆顶,插入新元素;
- 最终得到k个最小元素。
时间复杂度为O(nlogk)
方法三:使用快排分区函数
快排分区函数:选择一个数,把数组的数分为两部分,把比选中的数小或者相等的数移到数组的左边,把比选中的数大的数移动到数组的右边,返回分区后的选中数所在的下标。
时间复杂度为O(n)