带有重复项的java quicksort

时间:2017-01-31 21:06:39

标签: java duplicates quicksort

我试图实现快速排序,以下算法适用于具有所有唯一值的数组(例如{3,7,8,5,2,1,9,4}),但不适用于具有重复值的数组(例如{3,7,8,5,2,1,9,5,4})。

我理解为什么算法失败:因为两个指针i和j永远不会增加,所以当指向重复值时,条件arr [i]< pivot和arr [j]> pivot永远不会得到满足,代码陷入无限循环,试图反复交换这些值。我也明白,在交换行之后放置i ++和j--可以解决这个问题,并最终对数组进行正确的排序。但我不明白为什么。

我一直在研究quicksort,我认为一般的概念是在每次迭代排序数组/子阵列之后,枢轴最终会在它的最后一个"#34;排序位置。当我将i ++和j--行添加到这个算法时,这不再是真的;每次迭代都以枢轴不一定在最终位置结束,因此假设枢轴位置已经正确,对左右子阵列进行排序是没有意义的。

有人可以解释我的代码有什么问题,或者我对算法的理解有什么问题?谢谢!

public void quickSort(int[] arr) {

    quickSort(arr, 0, arr.length-1);
}

public void quickSort(int[] arr, int low, int high) {

    System.out.print("before: ");
    printArr(arr);

    if ( ((high - low) + 1) < 2) //as long as the subarray length not equal to 0 or 1
        return;

    int pivot = arr[low];
    int i = low;
    int j = high;

    System.out.println("pivot = " + pivot + ", low = " + low + ", high = " + high);

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

        while(arr[j] > pivot) {
            j--;
        }

        if(i < j) {
            swap(arr, i, j);
        }
    }

    System.out.print("after: ");
    printArr(arr);

    quickSort(arr, low, i-1);
    quickSort(arr, j+1, high);
}

public void swap(int arr[], int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

public void printArr(int[] arr) {
    for(int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }
    System.out.println();
}

0 个答案:

没有答案