最大的K个数堆排序可运行代码:
已通过测试:
#include<iostream>
using namespace std;
void heapadjust(int a[],int i,int n);
void build_min_heap(int a[],int n)//n为heap元素个数
{
int i;
for(i=n/2-1;i>=0;i--)//非叶节点最大序号为n/2-1
{
heapadjust(a,i,n);//调整堆
}
}
void heapadjust(int a[],int i,int n)//最小堆调整
{
int temp=a[i];
for(int j=2*i+1;j<n;j=j*2+1)
{
//当a[j+1]不存在,即没有右兄弟节点时,会读取内存数据-33686019
if(j<n-1&&(a[j+1]<a[j]))// 沿key较小的孩子结点向下筛选
++j;//j为key较小的记录的下标
if(temp>a[j])
{
a[i]=a[j];
i=j;//应插入位置
}
else break;//否则退出循环
}
a[i]=temp;//最后把需要调整的元素值放到合适的位置
}
void topK(int arr[],int n,int K)
{
if(n<K)
{
cout<<"error"<<endl;
return;
}
int *heap=new int[K];
for(int i=0;i<K;i++)
{
heap[i]=arr[i];
}
build_min_heap(heap,K);//建立最小堆
for(int i=0;i<K;i++)
cout<<heap[i]<<' ';
for(int i=K;i<n;i++)
{
if(arr[i]>heap[0])
{
heap[0]=arr[i];
heapadjust(heap,0,K);
}
}
for(int i=0;i<K;i++)
cout<<heap[i]<<' ';
}
int main()
{
int arr[100];
int n;int k;//n个数求最大的k个数
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
cin>>k;
topK(arr,n,k);
cout<<endl;
}
return 0;
}