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

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

形式化描述如下:

给出一组数:c1,c2,...,Cn的无序排列A,设c1

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

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

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

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

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

算法实现如下:

template void printTheKthMins(T a[],int n,int k) { MaxHeap *mh=new MaxHeap(); mh->Initialize(a,k); T x; for(int i=k;iMax()<Max()) { mh->DeleteMax(x); mh->Insert(a[i]); } } for(int i=0;iDeleteMax(x); std::cout<

 

附上全部代码如下:

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

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

编译命令:g++ -o theKthMins theKthMins.cc MaxHeap.h
文件 MaxHeap.h 如下:
#ifndef _H_MAXHEAP_H_ #define _H_MAXHEAP_H_ #include template class MaxHeap { public: MaxHeap():MaxSize(10) {} MaxHeap(int heapsize); ~MaxHeap(){delete [] heap;} T Max() { if(CurrentSize==0) std::cout<<"Heap is empty"<& Insert(const T& x); MaxHeap& DeleteMax(T& x); void Initialize(T a[],int size); private: int CurrentSize,MaxSize; T *heap; }; template MaxHeap::MaxHeap(int heapsize) { MaxSize=heapsize; heap=new T[heapsize]; CurrentSize=0; } template MaxHeap& MaxHeap::Insert(const T& x) { if(CurrentSize==MaxSize) { std::cout<<"no space"<heap[i/2-1]) { heap[i-1]=heap[i/2-1]; i/=2; } heap[i-1]=x; } return *this; } template MaxHeap& MaxHeap::DeleteMax(T& x) { x=heap[0]; T last=heap[CurrentSize-1]; --CurrentSize; int i=1; int ci=2; while(ci<=CurrentSize+1) { if(ciheap[ci-1]) break; heap[i-1]=heap[ci-1]; i=ci; ci*=2; } heap[i-1]=last; return *this; } template void MaxHeap::Initialize(T a[],int size) { CurrentSize=size; MaxSize=size; delete [] heap; heap=a; int i,c; T x; for(i=2;i<=size;++i) { x=heap[i-1]; c=i; while(c!=1&&x>heap[c/2-1]) { heap[c-1]=heap[c/2-1]; c/=2; } heap[c-1]=x; } } #endif //_H_MAXHEAP_H_
文件theKthMins.cc 如下:
#include #include "MaxHeap.h" template void printTheKthMins(T a[],int n,int k) { MaxHeap *mh=new MaxHeap(); mh->Initialize(a,k); T x; for(int i=k;iMax()<Max()) { mh->DeleteMax(x); mh->Insert(a[i]); } } for(int i=0;iDeleteMax(x); std::cout<
运行结果如下:
[jim@gpu1 heap]$ g++ -o theKthMins theKthMins.cc MaxHeap.h
[jim@gpu1 heap]$ ./theKthMins
5       4       3       2       1
[jim@gpu1 heap]$

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C/C++,Algorithm,Data,Structure)