/**
查找最小的k个元素
题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
*/
/*非常传统的一道题*/
#include <stdio.h>
#include <stdlib.h>
#define N 9
#define K 4
void HeapAdjust(int a[],int s,int k)
{
int t,key;
key=a[s];
for(t=2*s;t<=k;t*=2)
{
if(t<k && a[t]<a[t+1])
t++;
if(a[s]>a[t])
break;
a[s]=a[t];
s=t;
}
a[s]=key;
}
void MinKNum(int a[],int n,int k)
{
int i,tmp;
if(n-1<k)
exit(EXIT_FAILURE);
for(i=k/2;i>0;i--)
HeapAdjust(a,i,k);
for(i=k/2+1;i<n;i++)
{
if(a[i]<a[1])
{
tmp=a[i];
a[i]=a[1];
a[1]=tmp;
}
HeapAdjust(a,1,k);
}
}
int main()
{
int a[N];
int i;
for(i=1;i<N;i++)//数组从a[1]开始存储
scanf("%d",&a[i]);
MinKNum(a,N,K);//建立大顶堆
for(i=1;i<=K;i++)
printf("%d ",a[i]);
}
查找最小的k个元素
最新推荐文章于 2022-03-15 00:18:08 发布