在已知的含有十个元素的列表中找出其中前5大的数字,并降序输出
#include<stdio.h>
#include<stdlib.h>
void tiaozheng(int a[],int low,int high)
{
int i,j,t;
i=low;
j=i*2+1;
t=a[low];
while(j<=high)
{
if(a[j]>a[j+1] && j+1<= high)
j=j+1;
if(a[j]<t && j<=high)
{
a[i]=a[j];
i=j;
j=i*2+1;
}
else
{
a[i]=t;
break;
}
}
a[i]=t;
}
void topk(int a[],int n,int m) // n 为取多少位, m 为总共的位数
{
int i,t;
for(i=(n-2)/2;i>=0;i--) //将前 n 个数字构建成一个小根堆
tiaozheng(a,i,n-1);
for(i=n;i<m;i++) //依次遍历后面的元素
{
if(a[i]>a[0]) //并与堆顶元素比较
{
t=a[i];
a[i]=a[0];
a[0]=t;
tiaozheng(a,0,n-1);
}
}
for(i=n-1;i>=0;i--) //将堆中元素排序
{
t=a[0];
a[0]=a[i];
a[i]=t;
tiaozheng(a,0,i-1);
}
}
int main()
{
int i;
int a[10]={61,16,486,23,16,4,15,48,1,98};//486,98,61,48,23,16,16,15,4,1
topk(a,5,10);
for(i=0;i<5;i++)
printf("%d ",a[i]);
printf("\n");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
在函数中:
for(i=n;i<m;i++) //依次遍历后面的元素
{
if(a[i]>a[0]) //并与堆顶元素比较
{
t=a[i];
a[i]=a[0];
a[0]=t;
tiaozheng(a,0,n-1);
}
}
在之前,将前n个数据建堆之后,堆顶 的数据即为堆中最小的数,若之后遍历的数据,a[k] 比 a[0]大,及a[k]为前k项中较大的值,将其放入堆中,向下调整之后,堆中数据即为前 k 项中 最大的 n 个数