最大的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; }