AcWing 838. 堆排序
原题链接
简单
作者:
SHIJIA
,
2020-03-09 22:50:24
,
所有人可见
,
阅读 630
#include <iostream>
#include <vector>
using namespace std;
class Heap{
public:
Heap()=default;
Heap(const vector<int> &A):_vec(A){}
const int& top()
{
return _vec[0];
}
int size() const
{
return _vec.size();
}
bool empty() const
{
return _vec.empty();
}
void push(const int e)
{
_vec.push_back(e);
int i=size()-1;
up(i); //新元素插入尾端然后上滤恢复堆序性
}
void pop()
{
int n=size();
_vec[0]=_vec[n-1];
down(n,0); //末元素替换堆顶后进行下滤恢复堆序性
_vec.pop_back();
}
void heapsort()
{
make_heap();
int n=size();
while(n>1)
{
swap(_vec[0],_vec[--n]);
down(n,0);
}
}
int& operator[](int i){
if(i<size()) return _vec[i];
}
private:
vector<int> _vec;
void up(int i){
while(i>0){
int j=(i-1)>>1;
if(_vec[j]>_vec[i]) break;
swap(_vec[j],_vec[i]);
i=j;
}
}
void down(int n,int i){
int max=i;
int lc=2*i+1,rc=2*i+2;
if(lc<n && _vec[lc]>_vec[max]) max=lc;
if(rc<n && _vec[rc]>_vec[max]) max=rc;
if(max!=i){
swap(_vec[max],_vec[i]);
down(n,max);
}
}
void make_heap()
{
int n=size();
for(int i=(n-2)>>1;i>=0;i--) //从最后一个叶节点开始自下而上的下滤
down(n,i);
}
};
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
vector<int> a(n);
for(int i=0;i<n;++i) cin>>a[i];
Heap heap(a);
heap.heapsort();
for(int i=0;i<m;++i)
cout<<heap[i]<<' ';
cout<<endl;
return 0;
}