//最小堆算法。堆中容纳k个元素。
//堆顶元素最小。新来元素和堆顶比较。若小,舍弃。若大,替换堆顶,重新做堆。
//时间复杂度:O(N*log(k))每次更新堆log(k),更新n次
#include<iostream>
#include<vector>
using namespace std;
#define MIN -1111
class minHeap{
int n;
int* a;
public:
minHeap(int k):n(k){
a=new int[k];
for(int i=0;i<k;i++)a[i]=MIN;
}
void add(int i){
if(i<=a[0])return;
a[0]=i;
makeHeap();
}
void makeHeap(){
int i=0;
while(2*i+1<n){
if(2*i+2>=n){
if(a[i]>a[2*i+1])swap<int>(a[i],a[2*i+1]);return;
}
else{
if(a[i]<=min(a[2*i+1],a[2*i+2])){
return;
}
else{
if(a[2*i+1]<a[2*i+2]){
swap(a[i],a[2*i+1]);
i=2*i+1;continue;
}
else{
swap(a[i],a[2*i+2]);
i=2*i+2;continue;
}
}
}
}
}
void show(){
for(int i=0;i<n;i++)cout<<a[i]<<" ";
}
};
void input(int& i){i=rand()%100;}
void output(int& i){cout<<i<<" ";}
int main(){
int n;cout<<"intput n\n";cin>>n;
vector<int> v(n);
for_each(v.begin(),v.end(),input);
for_each(v.begin(),v.end(),output);cout<<endl;
int k;cout<<"input k\n";cin>>k;
minHeap m(k);
for(int i=0;i<v.size();i++){
m.add(v[i]);
}
m.show();
system("pause");
}
最小堆,堆顶最小,比堆顶小,扔了,比堆顶大,放入,重做堆