点击进入题目
堆排序:堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点(百度百科)
例题:输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。
#include<iostream>
const int N=1e5+5;
int n[N];
int a,b;
void down(int step)
{
int t=step;
if(step*2<=a&&n[step]>n[step*2]) t=step*2;
if(step*2+1<=a&&n[t]>n[step*2+1]) t=step*2+1;
if(t!=step)
{
swap(n[t],n[step]);
down(t);
}
}
int main()
{
cin>>a>>b;
for(int k=1;k<=a;k++)
cin>>n[k];
for(int k=a/2;k;k--)
{
down(k);
}
while(b--)
{
cout<<n[1]<<endl;
n[1]=n[a--];
down(1);
}
return 0;
}
模拟堆
维护一个集合,初始时集合为空,支持如下几种操作:
1.I x,插入一个数 x;
2.PM,输出当前集合中的最小值;
3.DM,删除当前集合中的最小值(数据保证此时的最小值唯一);
4.D k,删除第 k 个插入的数;
5.C k x,修改第 k 个插入的数,将其变为 x;
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int h[N];
int hp[N];
int ph[N];
int tsize;
void heap_swap(int a,int b)
{
swap(h[a],h[b]);
swap(hp[a],hp[b]);
swap(ph[hp[a]],ph[hp[b]]);
}
void down(int a)
{
int b=a;
if(a*2<=tsize&&h[b]>h[a*2]) b=2*a;
if(a*2+1<=tsize&&h[b]>h[a*2+1])b=2*a+1;
if(b!=a)
{
heap_swap(a,b);
down(b);
}
}
void up(int a)
{
while(a/2&&h[a/2]>h[a])
{
heap_swap(a/2,a);
a/=2;
}
}
int main()
{
int l,m=0;
cin>>l;
for(int j=1;j<=l;j++)
{
int k,x;
string op;
cin>>op;
if(op=="I")
{
cin>>x;
m++;
h[++tsize]=x;
hp[tsize]=m;
ph[m]=tsize;
up(tsize);
}
else if(op=="PM") cout<<h[1]<<endl;
else if(op=="DM")
{
heap_swap(1,tsize);
tsize--;
down(1);
}
else if(op=="D")
{
cin>>k;
int u=ph[k];
heap_swap(u,tsize);
tsize--;
down(u);
up(u);
}
else if(op=="C")
{
cin>>k>>x;
h[ph[k]]=x;
down(ph[k]);
up(ph[k]);
}
}
return 0;
}