堆的应用!--求第k大数
2015-07-16 19:48
141 查看
求一个数列中的第k大的数,将前k个数建最小堆,后面若比堆顶元素还小,则舍去,否则将堆顶置换成该元素,然后维护堆,最后输出堆顶元素~~
若求第k小的数,则只需建最大堆即可。
#include <stdio.h>
int a[101];
int n;
void down(int i)
{
int t,temp;
while(i*2<=n)
{
if (a[i]>a[i*2])
t=i*2;
else
t=i;
if ((i*2+1<=n)&&(a[t]>a[i*2+1]))
t=i*2+1;
if (t!=i)
{
temp=a[t];
a[t]=a[i];
a[i]=temp;
i=t;
}
else break;
}
}
int main()
{
int k,num,i;
scanf("%d%d",&k,&n);
num=n;//因为n是会变化的,所以要记录下来
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
for (i=k/2;i>=1;i--)
down(i);//把前k个元素建立成最小堆,堆顶就是现在的第k大元素
for (i=k+1;i<=n;i++)
if (a[i]>a[1])
{
a[1]=a[i];//把堆顶元素置换掉
down(1);
}
printf("%d ",a[1]);
printf("\n");
return 0;
}
若求第k小的数,则只需建最大堆即可。
#include <stdio.h>
int a[101];
int n;
void down(int i)
{
int t,temp;
while(i*2<=n)
{
if (a[i]>a[i*2])
t=i*2;
else
t=i;
if ((i*2+1<=n)&&(a[t]>a[i*2+1]))
t=i*2+1;
if (t!=i)
{
temp=a[t];
a[t]=a[i];
a[i]=temp;
i=t;
}
else break;
}
}
int main()
{
int k,num,i;
scanf("%d%d",&k,&n);
num=n;//因为n是会变化的,所以要记录下来
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
for (i=k/2;i>=1;i--)
down(i);//把前k个元素建立成最小堆,堆顶就是现在的第k大元素
for (i=k+1;i<=n;i++)
if (a[i]>a[1])
{
a[1]=a[i];//把堆顶元素置换掉
down(1);
}
printf("%d ",a[1]);
printf("\n");
return 0;
}
相关文章推荐
- 【甘道夫】HBase基本数据操作详解【完整版,绝对精品】
- 【试水CAS-4.0.3】第03节_CAS服务端登录页添加验证码
- 特征选择
- 使用history.back()出现"警告: 网页已过期的解决办法"
- 如何在Myeclipse中添加插件?
- 国内外BaaS服务盘点
- Android学习2——Activity之间跳转
- JQuery显示隐藏一个按钮
- JS前端框架10 Extjs5 使用Tips
- 如何入侵目标的网络DIY指南
- 数据库锁
- Codeforces 474D Flowers (线性dp 找规律)
- 关于简历
- ACM进阶计划
- 关于mysql_connect CLIENT_MULTI_RESULTS
- LightOJ 1295 Lighting System Design (排序+dp)
- 浏览一个目录
- LightOJ1074 SPFA判负环
- HDU 1027 以数列
- 士兵买香蕉