求最小的K个数 O(N) 一种实现-基于堆排序

来源:互联网 发布:网络限速p2p下载 编辑:程序博客网 时间:2024/06/12 21:37

题目要求:给出一组数(有n个),求出前k个最小的数:

形式化描述如下:

给出一组数:c1,c2,...,Cn的无序排列A,设c1<c2<...<Cn,要求输出c1,c2,...,ck。

算法思想:用给定排列的前k个数建最大堆,对于后面的n-k个数,逐个进行判断,Ai(K<i<=n)

如果Ai<堆中最大数,则删除堆中最大数,插入Ai。这样到最后,序列A中的前k个最小数,就是堆中的k个数了

说白了,就是开始时认为序列中的前k个数就是这k个最小数,然后通过判断剩余的数,看看是否比这k个数中最大的

还小,若小则将其换出,这样到最后,被换出的数肯定比这k个数都大,所以,这k个数就是前k个最小数了;

建堆的复杂度为klogk+logk(n-k),因为k是常数,所以为O(N)

算法实现如下:

 

附上全部代码如下:

共两个文件,一个是最大堆得实现(MaxHeap.h),一个是算法实现与运行演示(theKthMins.cc):

注意:(将这两个文件放在同一目录下)

编译命令:g++ -o theKthMins theKthMins.cc MaxHeap.h
文件 MaxHeap.h 如下:
文件theKthMins.cc 如下:
运行结果如下:
[jim@gpu1 heap]$ g++ -o theKthMins theKthMins.cc MaxHeap.h
[jim@gpu1 heap]$ ./theKthMins
5       4       3       2       1
[jim@gpu1 heap]$