[英]Find the Kth largest int in array
我正在嘗試在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個最小元素?
如@DietmarKühl所述,代碼中的<
和>
在partition()
是相反的,通過更改它們,它可以正常工作。
此外,我的建議是使用快速排序的普通partition()
,其兩個索引沿相同方向移動,並且其中一個索引永遠不會超過另一個索引。 使任何人感到困惑都不容易。
int partition(int *input, int p, int r) {
int pivot,i,j,tmp;
pivot = input[r];
i = p-1;
for (j=p;j<=r-1;j++) {
if (input[j]>= pivot) {
i++;
tmp = input[i];
input[i] = input[j];
input[j] = tmp;
}
}
tmp = input[i+1];
input[i+1] = input[r];
input[r] = tmp;
return i+1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.