如何将QuickSort转换为QuickSelect?

发布于 2025-01-25 12:41:51 字数 1713 浏览 2 评论 0原文

我已经对QuickSort进行了以下实现,但是试图将其传输到QuickSelect失败。

class Solution {
    public static void main(String[] args) {
        for (int i = 1; i < 5; i++) {
            int[] arr = new int[]{9,8,7,1,2,3,6,5,4};
            System.out.println(quicksort(arr, i));
        }
    }

    private static int quicksort(int[] arr, int k) {
        return quicksort(arr, 0, arr.length - 1, k);
    }

    private static int quicksort(int[] arr, int low, int high, int k) {
        int p = partition(arr, low, high);
        /* Doesnt work:
        if (p == k) {
            return arr[k];
        } else if (p < k) {
            return quicksort(arr, p+1, high, k);
        } else {
            return quicksort(arr, low, p-1, k);
        }
        */
    }

    private static int partition(int[] arr, int low, int high) {
        int i = low;
        int j = high;
        int pivot = arr[low + (high - low) / 2];

        while (true) {
            while (arr[i] < pivot) {
                i++;
            }
            while (arr[j] > pivot) {
                j--;
            }

            if (i < j) {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            } else {
                return j;
            }
        }
    }
}

感觉就像0..P的所有内容都较小或等于ARR [P],而反之亦然。

例子: 9,8,7,1,2,3,6,5,4,分区之后:2、1、7、7、8、9、3、6、5、4 带有p = 1(选择的枢轴为2)。因此,我知道第一个和第二最低的值在0..1范围内。但是它没有排序,所以如果(p == k-1)返回arr [p],我不能简单地说,因为不能保证arr [p] 是那一半的最大值,只是那一半的所有内容都小于选择的枢轴。

知道我如何使它起作用吗?

I've the following implementation for quicksort, but trying to transfer it to quickselect fails.

class Solution {
    public static void main(String[] args) {
        for (int i = 1; i < 5; i++) {
            int[] arr = new int[]{9,8,7,1,2,3,6,5,4};
            System.out.println(quicksort(arr, i));
        }
    }

    private static int quicksort(int[] arr, int k) {
        return quicksort(arr, 0, arr.length - 1, k);
    }

    private static int quicksort(int[] arr, int low, int high, int k) {
        int p = partition(arr, low, high);
        /* Doesnt work:
        if (p == k) {
            return arr[k];
        } else if (p < k) {
            return quicksort(arr, p+1, high, k);
        } else {
            return quicksort(arr, low, p-1, k);
        }
        */
    }

    private static int partition(int[] arr, int low, int high) {
        int i = low;
        int j = high;
        int pivot = arr[low + (high - low) / 2];

        while (true) {
            while (arr[i] < pivot) {
                i++;
            }
            while (arr[j] > pivot) {
                j--;
            }

            if (i < j) {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            } else {
                return j;
            }
        }
    }
}

It feels like the information that everything from 0..p is smaller or equal to arr[p] and vice-versa does not help at all.

Example:
9,8,7,1,2,3,6,5,4, after partition: 2, 1, 7, 8, 9, 3, 6, 5, 4 with p = 1 (choosen pivot was 2). So I know the first and second lowest value is in 0..1 range. But it isn't sorted, so I cannot simply say if (p == k-1) return arr[p], because it isn't guaranteed that arr[p] is the max of that half, just that everything in that half is less than the choosen pivot.

Any idea how I can make it work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文