要从10亿数字中找出前100大的数字,可以采用基于堆的排序算法实现。具体步骤如下:
- 遍历所有数字,将它们逐个插入到一个容量为100的小根堆中,如果小根堆未满,则直接插入。
- 如果小根堆已满,则比较堆顶元素和当前数字的大小,如果当前数字比堆顶元素大,则弹出堆顶元素,并插入当前数字。
- 遍历完所有数字后,小根堆中剩下的就是前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]);
}
}
}