【发布时间】:2020-11-15 15:04:06
【问题描述】:
给定一个数组和一个数字 k,其中 k 小于数组的大小,我们需要找到给定数组中第 k 个最小的元素。
当数组中有重复项时,我很困惑。 显然,当试图在 [2, 2, 2, 2, 2] 中找到第三个元素时,我的下面的算法将被卡住 如何处理这样的问题?
下面的函数使用快速选择算法找出第k个最小的元素。
int findTopK(int L, int R, int K) {
if (L == R) return arr[L];
int i = L, j = R;
int pivot = arr[R];
while (true) {
while (i <= R && arr[i] < pivot) i++;
while (j >= L && arr[j] >= pivot) j--;
if (i >= j) break;
swap(arr[i], arr[j]);
i++; j--;
}
//[L, j] [j+1, R]
//left: < pivot
//right: >= pivot
if (j - L + 1 < K) return findTopK(j+1, R, K - (j - L + 1));
else return findTopK(L, j, K);
}
【问题讨论】:
-
您能否详细说明问题...?
-
您可以使用 fat pivot 即将所有相等的主元值交换到
j <= k <= l范围内,其中j表示相等的k-th 元素中的第一个,并且l表示最后一个。
标签: c++ algorithm sorting quicksort