輸入 n 個整數,找出最小的 k 個並按升序輸出。n, k ≤ 200,000,數值範圍 [0, 1e9]。
≤ pivot 與 > pivot 兩部分== k-1,前 k 項即為最小的 k 個(無序)O(n)k 項做完整快排 O(k log k)int partition(int l, int r) {
int pivot = arr[r], i = l-1;
for (int j=l; j k-1) r = idx-1;
else l = idx+1;
idx = partition(l, r);
}
}
void qsort(int l, int r) { // 標準快排
if (l >= r) return;
int m = partition(l, r);
qsort(l, m-1); qsort(m+1, r);
}
O(n + k log k),最壞 O(n²)(可用隨機 pivot 改善)O(1) 原地演算法Time: 950 ms, Memory: 1696 KB (C, 九度 OJ 1371)