微软面试一百题之5.查找最小的 k 个元素

5.查找最小的 k 个元素
题目:输入 n 个整数,输出其中最小的 k 个。

例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。


基本思路:

使用堆排序基本思想,对堆排序做小小修改,在堆排序的算法中增加一个变量k,表示只需要最小的k个数。

那么意味着在最初的小根堆建立起来的基础上,进行k次的堆顶值转移至数组尾部。

在第k次退出,在数组的尾部就会出现k个最小数的组成的递减序列了,从尾部开始打印数组k个数就可以了。


时间复杂度分析:

n + k * log(n)


复习:

堆排序的基本思路:

1)首先建立最初的小根堆

需要从堆的第一个非叶子结点开始到根节点进行堆调整,那么得到最初的小根堆

得到小根堆的结果仅仅是最小的值在堆顶

2)每次将小根堆的堆顶最小值放入数组的后面,

即每次让堆顶值与数组尾部交换,在数组尾部形成一个倒序的有序序列,得到的结果是第一小值放在倒数第一的位置,而第k小的放在倒数第k位置

3)每次交换后,前面n-1个结点就不符合小根堆的要求了,需要调整


代码:

{CSDN:CODE:305758}

 

结果:

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值