随机选择第k个最大元素

时间:2018-04-11 16:55:07

标签: java algorithm

我最近一直在研究算法,并得到了随机选择算法。我想弄明白,偶然发现这个网站

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;
}

1 个答案:

答案 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)