题目
从键盘读入大小无序的2000个整数并已建立顺序表。
请用时间复杂度最低的算法挑选出最大的前20个整数并打印(模仿堆排序的思想)
代码
#include <iostream>
using namespace std;
typedef int ElemType;
//将元素k为根的子树进行调整
void HeadAdjust(ElemType A[],int k,int len){
A[0]=A[k]; //暂存子树结点的值
for(int i=2*k;i<=len;i*=2){ //沿key较大的子结点向下筛选
if(i<len&&A[i]<A[i+1]) //表明右孩子比左孩子的值大
i++;
if(A[0]>=A[i])
break; //根结点本身就是最大的,不用往下再比了,筛选结束
else{ //孩子比根结点大,则进行交换
A[k]=A[i];
k=i; //修改k的值继续往下筛选
}
}
A[k]=A[0]; //筛选结束,将值放在最终位置
}
//初始建堆 大根堆
void BuildMaxHeap(ElemType A[],int len){
for(int i=len/2;i>0;i--) //从最后一个非叶子结点开始调整
HeadAdjust(A,i,len);
}
//堆排序
void HeapSort(ElemType A[],int len){
BuildMaxHeap(A,len); //初始建堆
for(int i=len;i>1;i--){
cout<<A[1]<<" ";
swap(A[i],A[1]);
HeadAdjust(A,1,i-1);
}
}
int main() {
ElemType A[11]={0,4,2,1,6,3,3,9,7,2,1}; //第0个位置不用
HeapSort(A,11);
return 0;
}
实现效果
代码的实现就是对一组数据进行排序,而不是实现输出前几个数,若想输出前几个数,可以对堆排序实现几次调整就行了