【606、从10亿数字里面找出前100大的数字】

37 阅读1分钟

要从10亿数字中找出前100大的数字,可以采用基于堆的排序算法实现。具体步骤如下:

  1. 遍历所有数字,将它们逐个插入到一个容量为100的小根堆中,如果小根堆未满,则直接插入。
  2. 如果小根堆已满,则比较堆顶元素和当前数字的大小,如果当前数字比堆顶元素大,则弹出堆顶元素,并插入当前数字。
  3. 遍历完所有数字后,小根堆中剩下的就是前100大的数字了。

这种算法的时间复杂度是 O(n log k),其中 k 为小根堆的容量,通常 k 远小于 n,所以这个算法效率很高。

下面是 Java 代码实现:

import java.util.PriorityQueue;

public class TopKNumbers {

    public static void main(String[] args) {
        int[] nums = new int[1000000000]; // 10亿个数字
        // 省略填充nums数组的代码

        int k = 100; // 要找出前100大的数字
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(k); // 小根堆
        for (int i = 0; i < nums.length; i++) {
            if (i < k) { // 前k个数字直接插入
                minHeap.offer(nums[i]);
            } else { // 第k+1个数字开始和堆顶元素比较
                if (nums[i] > minHeap.peek()) {
                    minHeap.poll();
                    minHeap.offer(nums[i]);
                }
            }
        }

        // 输出前k大的数字
        int[] topK = new int[k];
        for (int i = 0; i < k; i++) {
            topK[i] = minHeap.poll();
        }
        for (int i = k - 1; i >= 0; i--) {
            System.out.println(topK[i]);
        }
    }

}