如果要求一组数据中的前k个最小的数,那么需要建立一个最大堆。
//PriorityQueue底层是最小堆 如果需要找前k个最小数
//需要建立最大堆 所以用到比较器来重写最小堆
public class TOPK {
public static void topK(int[] arr,int k)
{
//new Comparator<Integer>(){}表示匿名类 重写了Comparator方法,使得PriorityQueue
//在建立堆时建立最大堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for(int i = 0; i < arr.length; i++){
if(maxHeap.size() < k){
maxHeap.offer(arr[i]);
}else{
int temp = maxHeap.peek();
if(arr[i] < temp){
maxHeap.poll();
maxHeap.offer(arr[i]);
}
}
}
System.out.println(maxHeap);
}
public static void main(String[] args) {
int[] arr = {55,1,5,2,3,6,33,2,4,5};
topK(arr, 5);
//写法二
Arrays.sort(arr);
for(int i = 0; i < 5; i++){
System.out.println(arr[i]);
}
}
}