首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速选择的正确条件

快速选择的正确条件
EN

Stack Overflow用户
提问于 2021-06-13 09:34:45
回答 1查看 36关注 0票数 0

我正在实现快速选择算法来获取数组中的第k个元素,并且我被困在一个我不知道如何解析的地方。下面是我的不起作用的代码:

代码语言:javascript
复制
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];
}

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

代码语言:javascript
复制
        if (partitionIndex == k) {
            return;
        }

它变得快速排序,并且运行良好。我理解为什么它不起作用,因为我得到的从0到k的数组可能没有排序,因为我在上面的条件下返回。但是我找不到合适的条件,我只对数组中的前k个元素进行排序,而忽略了其余的元素,所以我不需要做任何额外的工作。我已经在线查看了一些实现,并在上面花了一些时间,但无法弄清楚,所以请联系我们寻求帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-13 14:59:34

如果k< partitionIndex,只检查左边的分区,否则只检查右边的分区。

代码语言:javascript
复制
        if (k < partitionIndex)
            quickSelect(nums, start, partitionIndex - 1, k);
        else
            quickSelect(nums, partitionIndex + 1, end, k);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67954168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档