用堆排序实现查找最小的K个元素

转载自:http://blog.chinaunix.net/uid-28977986-id-3864505.html
  2013-08-24 19:25:51

分类: C/C++

题目:查找最小的k个元素。

利用堆排序解决这个问题的思路有两种:
   思路 1:将输入的n个数建立成大顶堆并排序后,再遍历输出前k个元素,此k个元素即使最小的K个元素。
  思路2:  维护k个元素的最大堆,即用容量为k的最大堆存储最先遍历到的k个数,并假设他们是最小的k个数。继续遍历数列,每次遍历到一个元素,将它与堆顶元素比较,若小于堆顶元素,更新堆,否则,不更新堆。

 思路1的代码和实现堆排序的代码相同。
 
  思路2的代码实现如下:
   
  1. #include<iostream>
  2. using namespace std;

  3.  void swap(int &a,int &b)
  4.  {
  5.      int tmp;
  6.      tmp=a;
  7.      a=b;
  8.      b=tmp;
  9.  
  10.  }


  11. void HeapAdjust(int a[],int i,int k)
  12. {
  13.     int lchild,rchild;
  14.     int max=i;
  15.     lchild=2*i;
  16.     rchild=2*i+1;
  17.     if(i<=k/2)
  18.     {
  19.         if(lchild<=&& a[lchild]>a[max])
  20.          max=lchild;
  21.      if(rchild<=&& a[rchild]>a[max])
  22.          max=rchild;
  23.      if(max!=i)
  24.         {
  25.          swap(a[max],a[i]);
  26.      HeapAdjust(a,max,k);
  27.         }
  28.     }

  29. }


  30. int main()
  31. {
  32.     int i,j,k,size;
  33.     int a[100];
  34.     printf("please input the size of heap:");
  35.     while(scanf("%d",&size)==&& size>0)
  36.     {
  37.         printf("请输入堆的元素值:");
  38.      for(i=1;i<=size;i++)
  39.             scanf("%d",&a[i]);
  40.         printf("请输入k的值");
  41.         scanf("%d",&k);

  42.         for(i=k/2;i>=1;i--)
  43.             HeapAdjust(a,i,k);
  44.         
  45.      for(j=k+1;j<=size;j++)
  46.         {
  47.          if(a[j]<a[1])
  48.             {
  49.              a[1]=a[j];
  50.                 HeapAdjust(a,1,k);
  51.             
  52.             }
  53.         }

  54.         for(i=1;i<=k;i++)
  55.             cout<<a[i]<<" ";
  56.     }
  57.     return 0;


  58. }
  
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值