题目描述
寻找N个数字中最大的K个数字
package chapter_2_binary;
import java.util.Scanner;
/**
* @author LiangGe
*
* 寻找一批数字中最K大数
*
* 前K个元素,建立小顶堆,之后每个元素和堆顶元素比较
*
*/
public class question_2_5_3 {
public static void swap(int[] data, int i, int j) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
public static void keepMinHeap(int[] data, int top, int len) {
int curTop = top;
for(int i=curTop*2+1; i<=len;) {
if(i < len && data[i+1] < data[i]) {
i ++;
}
if(data[i] < data[curTop]) {
swap(data, i, curTop);
}
curTop = i;
i = curTop * 2 + 1;
}
}
public static void buildMinHeap(int[] data, int len) {
int end = (len - 1) / 2;
for(int i= end; i>=0; i--) {
keepMinHeap(data, i, len);
}
}
public static void findKthBigest(int[] data, int k) {
buildMinHeap(data, k-1);
for(int i=k; i<data.length; i++) {
if(data[i] > data[0]) {
swap(data, i, 0);
keepMinHeap(data, 0, k-1);
}
}
}
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.nextLine();
while(num -- > 0) {
int n = scanner.nextInt();
int k = scanner.nextInt();
scanner.nextLine();
String string = scanner.nextLine();
String[] strs = string.split(" ");
int[] data = new int[strs.length];
for(int i=0; i< data.length; i++) {
data[i] = Integer.parseInt(strs[i]);
}
findKthBigest(data, k);
for(int i=0; i< k; i++) {
System.out.printf("%3d", data[i]);
}
}
}
}