求一个数列中的第k大的数,将前k个数建最小堆,后面若比堆顶元素还小,则舍去,否则将堆顶置换成该元素,然后维护堆,最后输出堆顶元素~~
若求第k小的数,则只需建最大堆即可。
public class heap_test {//求第k大的数,维护一个大小为k的最小堆
private static int k,n;
private static int []a=new int [101];
public static void down(int i,int n){
int t,temp;
while(i*2<=n){
if (a[i]>a[i*2]){
t=i*2;
}else{
t=i;
}
if (a[t]>a[i*2+1]){
t=i*2+1;
}
if (t!=i){
temp=a[t];
a[t]=a[i];
a[i]=temp;
i=t;
}else break;
}
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
k=cin.nextInt();//读取k
n=0;
while(cin.hasNextInt()){
n++;
a[n]=cin.nextInt();
}
cin.close();
if (k<=n){
for (int i=k/2;i>=1;i--){
down(i,k);
}
int num=n;
for (int i=k+1;i<=num;i++){
if (a[i]>a[1]){//如果更大
a[1]=a[i];
down(1,i);
}
}
System.out.println(a[1]);
}
}
}