我最近一直在研究算法,并得到了随机选择算法。我想弄明白,偶然发现这个网站
https://www.geeksforgeeks.org/kth-smallestlargest-element-unsorted-array-set-2-expected-linear-time/
显示代码,几乎没有解释它是如何工作的。
它可以找到第k个最小元素,但为了显示第k个最大元素怎么能改变呢?
特别是关于这种方法
int kthSmallest(int arr[], int l, int r, int k)
{
// If k is smaller than number of elements in array
if (k > 0 && k <= r - l + 1)
{
// Partition the array around a random element and
// get position of pivot element in sorted array
int pos = randomPartition(arr, l, r);
// If position is same as k
if (pos-l == k-1)
return arr[pos];
// If position is more, recur for left subarray
if (pos-l > k-1)
return kthSmallest(arr, l, pos-1, k);
// Else recur for right subarray
return kthSmallest(arr, pos+1, r, k-pos+l-1);
}
// If k is more than number of elements in array
return Integer.MAX_VALUE;
}
答案 0 :(得分:1)
您不必修改此方法kthSmallest
。相反,您应该修改方法partition
(取自您提供的链接):
int partition(int arr[], int l, int r)
{
int x = arr[r], i = l;
for (int j = l; j <= r - 1; j++)
{
if (arr[j] >= x)
{
swap(arr, i, j);
i++;
}
}
swap(arr, i, r);
return i;
}
我在这里更改了if语句:if (arr[j] <= x)
到if (arr[j] >= x)