您的位置:首页 > 其它

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

2013-08-25 17:30 211 查看
转载自: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的代码实现如下:



#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;

}

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: