【问题标题】:Correct conditions for quickselect快速选择的正确条件
【发布时间】:2021-08-29 09:51:05
【问题描述】:

我正在实现快速选择算法以获取数组中的kth 元素,但我被困在一个我不知道如何解决的地方。这是我的代码不起作用:

public static void main (String[] args) {
    int[] arr = new int[]{7,6,5,4,3,2,1}; 
    int k = 4;
    quickSort(arr, 0, arr.length - 1, k);
    return arr[k];
}

private static void quickSelect(int[] nums, int start, int end, int k) {
    if (start < end) {
        int partitionIndex = getPartitionIndex(nums, start, end);
        if (partitionIndex == k) {
            return;
        }
        quickSelect(nums, start, partitionIndex - 1, k);
        quickSelect(nums, partitionIndex + 1, end, k);
    }
}

private int getPartitionIndex(int[] nums, int start, int end) {
    int pivot = nums[end];
    int index = start;
    for (int i = start; i <= end; i++) {
        int current = nums[i];
        if (current < pivot) {
            swap(nums, index, i);
            index++;
        }
    }
    swap(nums, index, end);
    return index;
}

private void swap(int[] nums, int i, int j) {
    if (i == j) {
        return;
    }
    nums[i] = nums[i] ^ nums[j];
    nums[j] = nums[i] ^ nums[j];
    nums[i] = nums[i] ^ nums[j];
}

当然,如果我删除这些行:

        if (partitionIndex == k) {
            return;
        }

它变成了快速排序并且工作正常。而且我理解它为什么不起作用,这是因为当我在上述条件下返回时,我从 0 到 k 的数组可能没有被排序。但是我无法找到正确的条件,只对数组中的前 k 个元素进行排序而忽略其余元素,这样我就不会做任何额外的工作。我在网上查看了一些实现,并在上面花了一些时间,但无法弄清楚,所以寻求帮助。

【问题讨论】:

    标签: java quicksort quickselect


    【解决方案1】:

    如果k

            if (k < partitionIndex)
                quickSelect(nums, start, partitionIndex - 1, k);
            else
                quickSelect(nums, partitionIndex + 1, end, k);
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 2019-11-24
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多