前k个数
求海量数据(正整数)按逆序排列的前k个数(topK),因为数据量太大,不能全部存储在内存中,只能一个一个地从磁盘或者网络上读取数据,请设计一个高效的算法来解决这个问题
第一行:用户输入K,代表要求得topK
随后的N(不限制)行,每一行是一个整数代表用户输入的数据
用户输入-1代表输入终止
请输出topK,从小到大,空格分割
public static void f3(){ //小顶堆与TOPK的具体实现
Scanner input=new Scanner(System.in);
int k=input.nextInt();
int[] a=new int[k];
int i=input.nextInt();
while(i!=-1){
deal(a,i,k);
i=input.nextInt();
}
}
public static void deal(int[] a,int i,int k){ //处理输入的数据
if(n<k){
a[n++]=i;
if(n==k){
build_smallheap(a);
for(int m=0;m<a.length;m++){
System.out.print(a[m]+" ");
}
}
}
else{
if(a[0]<i){ //输入的数据如果大于小顶堆中的最小数字,就进行置换,并重新小顶堆化
a[0]=i;
smallheap(a,0);
for(int m=0;m<a.length;m++){
System.out.print(a[m]+" ");
}
}
}
}
public static void smallheap(int[] a,int index){ //小顶堆
if(index>(a.length-2)/2) return;
int left=2*index+1;
int right=2*index+2;
int min=index;
if(a[left]<a[min]&&left<a.length) min=left;
if(a[right]<a[min]&&right<a.length) min=right;
if(min!=index){
int temp=a[min];
a[min]=a[index];
a[index]=temp;
smallheap(a,min);
}
}