在海量數據處理場景中,從 N 個數字中快速選出最大的前 10 個並有序輸出,是一個經典的算法問題。當 N 達到 1000 億量級,數值範圍在 0 到 2,147,483,647 之間時,傳統的全量排序顯然不切實際——時間複雜度 O(N log N) 和空間佔用都會成為瓶頸。
利用大小固定為 10 的最小堆,只需 O(N log 10) ≈ O(N) 的時間複雜度即可解決。算法流程如下:
#define PARENT(i) ((i) / 2 - 1)
#define LEFT(i) ((i + 1) * 2 - 1)
#define RIGHT(i) ((i + 1) * 2)
void max_heapify(int *sbuff, int j) {
int i;
if (sbuff[j] < sbuff[LEFT(j)]) i = LEFT(j);
else i = j;
if (sbuff[i] < sbuff[RIGHT(j)]) i = RIGHT(j);
if (i != j) {
sbuff[i] ^= sbuff[j];
sbuff[j] ^= sbuff[i];
sbuff[i] ^= sbuff[j];
max_heapify(sbuff, i);
}
}
實測 1,000,000 輸入:總比較 4,232,804 次,內存寫入 3,849,024 次,耗時僅 0.046 秒。這證明了堆選擇法在大數據量下的卓越效率。
完整代碼包含測試數據生成、輸入讀取、堆操作及統計輸出模塊,可直接編譯運行驗證。