思路: 使用堆排序
对于最大的topN,采用小顶堆,先将数组里面的前N个树构建小顶堆,后来的数num如果大于根节点,则将根节点取出,将num压入,一遍以后堆里面的数据就是最大的TopN。时间复杂度为O (nlogn)。
最小的TopN则与刚才的相反
Tip: Java可以使用PriorityQueue
实现大顶堆和小顶堆
// 大顶堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>();
// 小顶堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer t0, Integer t1) {
return t1 - t0;
}
});
上代码:
package pdk.demo.algo;
import java.util.Comparator;
import java.util.PriorityQueue;
public class TopN {
// 最大的topN
private static void topMaxN(int[] array, int n) {
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
// 将前N个树放入堆中
for (int i=0; i<n; i++)
minHeap.add(array[i]);
// 如果第i个数大于根节点,则移除根节点,将新的数放入堆中
for (int i=3; i<array.length; i++) {
if (minHeap.peek() < array[i]) {
minHeap.poll();
minHeap.add(array[i]);
}
}
for (int res : minHeap) {
System.out.println(res);
}
}
// 最小的topN
private static void topMinN(int[] array, int n) {
// 大顶堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer t1) {
return t1 - integer;
}
});
// 将前N个树放入堆中
for (int i=0; i<n; i++)
maxHeap.add(array[i]);
// 如果第i个数小于根节点,则移除根节点,将新的数放入堆中
for (int i=3; i<array.length; i++) {
if (maxHeap.peek() > array[i]) {
maxHeap.poll();
maxHeap.add(array[i]);
}
}
for (int res : maxHeap) {
System.out.println(res);
}
}
public static void main(String[] args) {
int[] array = {3,12,5,2,32,54,62,14,65,63,18};
topMinN(array, 3);
}
}