2401_86550216 2025-03-03 14:30 采纳率: 0%
浏览 6

快速排序自己想感觉有这个有很多漏洞

快速排序有2个问题,第一个是左右指针交换后,左指针对应的数和基准数相同,右指针要向左移一下,那么我左指针右移一下可以吗,第二个是只有当两个指针相遇和相交的情况下再退出循环,但我想不到什么情况下指针会相交,能举个例子吗

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-03-03 14:30
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    快速排序的漏洞

    你提到两个问题,都是快速排序算法中常见的漏洞。

    第一个问题

    你说的是,在左右指针交换后,左指针对应的数和基准数相同,右指针要向左移一下,那么你左指针右移一下可以吗?答案是不能。因为左指针已经和基准数相同了,右移一下将会导致左指针指向的数和基准数相同,导致算法的正确性。

    第二个问题

    你说的是,只有当两个指针相遇和相交的情况下再退出循环,但你想不到什么情况下指针会相遇和相交。实际上,这种情况发生在快速排序的递归调用中,当递归调用返回时,指针会相遇和相交。

    解决方案:

    1. 在左右指针交换后,右指针向左移一下,以确保左指针和右指针之间的数都小于基准数。
    2. 在递归调用返回时,检查指针是否相遇和相交,如果相遇和相交,则退出循环。

    代码示例:

    public void quickSort(int[] arr, int left, int right) {
        if (left >= right) return;
        int pivot = arr[left];
        int i = left + 1;
        int j = right;
        while (i <= j) {
            while (i <= j && arr[i] <= pivot) i++;
            while (i <= j && arr[j] > pivot) j--;
            if (i <= j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
            }
        }
        arr[left] = arr[j];
        arr[j] = pivot;
        quickSort(arr, left, j - 1);
        quickSort(arr, j + 1, right);
    }
    

    注意:上面的代码只是一个简单的示例,实际实现中可能需要更多的逻辑和优化。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月3日