原始碼嘗試用「每次找最小值並移除」的方式求第 K 小,但存在嚴重缺陷:
n[q] = n[q+1] 在 q 為最後一個元素時會**陣列越界**。int partition(int a[], int l, int r) {
int pivot = a[r], i = l - 1;
for (int j = l; j < r; ++j)
if (a[j] <= pivot) swap(&a[++i], &a[j]);
swap(&a[i+1], &a[r]);
return i+1;
}
int quickSelect(int a[], int l, int r, int k) { // k 從 1 開始
if (l == r) return a[l];
int p = partition(a, l, r);
int rank = p - l + 1;
if (k == rank) return a[p];
else if (k < rank) return quickSelect(a, l, p-1, k);
else return quickSelect(a, p+1, r, k-rank);
}
qsort 後取 a[k-1],簡單可靠。nth_element 平均 O(N)。核心觀念:避免手動移動陣列元素,改用分治法在原地分區,即能高效求第 K 小並天然避免越界。