【发布时间】:2018-04-12 14:57:39
【问题描述】:
我正在尝试在 c++ 中使用 quickselect 来执行此操作,但它不断返回我第 k 个最小的元素而不是第 k 个最大的元素。我的逻辑哪里错了?
int partition(int* input, int p, int r)
{
int pivot = input[r];
while ( p < r )
{
while ( input[p] < pivot )
p++;
while ( input[r] > pivot )
r--;
if ( input[p] == input[r] )
p++;
else if ( p < r ) {
int tmp = input[p];
input[p] = input[r];
input[r] = tmp;
}
}
return r;
}
int quick_select(int* input, int p, int r, int k)
{
if ( p == r ) return input[p];
int j = partition(input, p, r);
int length = j - p + 1;
if ( length == k ) return input[j];
else if ( k < length ) return quick_select(input, p, j - 1, k);
else return quick_select(input, j + 1, r, k - length);
}
我应该改变什么来使这个第 k 个最大而不是第 k 个最小的元素?
【问题讨论】:
-
您似乎将元素划分为前面的小元素和后面的大元素。但是,您从前面而不是从后面选择第 k 个元素。切换方向或从后面选择第 k 个元素。
-
请注意,在实际代码中,您通常希望使用
std::nth_element来执行此操作,而不是自己编写。
标签: c++ algorithm quickselect