快速排序遇到重复元素可以这样解决吗?

我这个排序算法是以数组第一个元素为枢轴,为了解决遇到与枢轴有相同值,导致快排进入死循环的情况,例如
{-9,78,0,23,-9,-567,70},我在判断arr[ l ]与arr[ r ]与枢轴pivot之间大小时,加了个=,可以这样解决吗?

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

是的,这样可以解决当数组出现相同值时,让快排不进入死循环的问题。就是把代码中 arr[r]>pivot 改成 arr[r] >= pivot,加上一个等号,表示当arr[r]等于pivot的时候,也需要将枢轴的值放到数组的左边。


public static void quickSort(int[] arr, int left, int right){
    if (left < right && right - left > 0){
        int pivot = arr[left];
        int l = left;
        int r = right;
        int temp;
        while (l < r){
            while (l < r && arr[r] >= pivot){ //注意这里加了等号
                r--;
            }
            temp = arr[l];
            arr[l++] = arr[r];
            arr[r] = temp;

            while (l < r && arr[l] <= pivot){
                l++;
            }
            temp = arr[r];
            arr[r--] = arr[l];
            arr[l] = temp;
        }
        arr[l] = pivot;
        
        quickSort(arr, left, l - 1);
        quickSort(arr, l + 1, right);
    }
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^