加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

堆的应用!--求第k大数

发布时间:2020-12-14 02:28:36 所属栏目:大数据 来源:网络整理
导读:求一个数列中的第k大的数,将前k个数建最小堆,后面若比堆顶元素还小,则舍去,否则将堆顶置换成该元素,然后维护堆,最后输出堆顶元素~~ 若求第k小的数,则只需建最大堆即可。 #include stdio.h int a[101]; int n; ?void down(int i) ?{ ???? int t,temp;

求一个数列中的第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; ??? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读