转载自: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:将输入的n个数建立成大顶堆并排序后,再遍历输出前k个元素,此k个元素即使最小的K个元素。
思路2: 维护k个元素的最大堆,即用容量为k的最大堆存储最先遍历到的k个数,并假设他们是最小的k个数。继续遍历数列,每次遍历到一个元素,将它与堆顶元素比较,若小于堆顶元素,更新堆,否则,不更新堆。
思路1的代码和实现堆排序的代码相同。
思路2的代码实现如下:
- #include<iostream>
- using namespace std;
-
- void swap(int &a,int &b)
- {
- int tmp;
- tmp=a;
- a=b;
- b=tmp;
-
- }
-
-
- void HeapAdjust(int a[],int i,int k)
- {
- int lchild,rchild;
- int max=i;
- lchild=2*i;
- rchild=2*i+1;
- if(i<=k/2)
- {
- if(lchild<=k && a[lchild]>a[max])
- max=lchild;
- if(rchild<=k && a[rchild]>a[max])
- max=rchild;
- if(max!=i)
- {
- swap(a[max],a[i]);
- HeapAdjust(a,max,k);
- }
- }
-
- }
-
-
- int main()
- {
- int i,j,k,size;
- int a[100];
- printf("please input the size of heap:");
- while(scanf("%d",&size)==1 && size>0)
- {
- printf("请输入堆的元素值:");
- for(i=1;i<=size;i++)
- scanf("%d",&a[i]);
- printf("请输入k的值");
- scanf("%d",&k);
-
- for(i=k/2;i>=1;i--)
- HeapAdjust(a,i,k);
-
- for(j=k+1;j<=size;j++)
- {
- if(a[j]<a[1])
- {
- a[1]=a[j];
- HeapAdjust(a,1,k);
-
- }
- }
-
- for(i=1;i<=k;i++)
- cout<<a[i]<<" ";
- }
- return 0;
-
-
- }
![](https://i-blog.csdnimg.cn/blog_migrate/f0b5230ed9756a2176faf8083edc6fab.jpeg)