使用枢轴作为中间而不是第一个索引的Quicksort排序不正确

时间:2017-03-13 17:51:26

标签: java algorithm debugging pivot quicksort

快一点。当枢轴是中间值时,我努力使这个代码工作。我知道当枢轴是最左边的值时它会起作用。有什么帮助吗?

public class Quicksort {

    public static void main(String[] args) {
        int[] numbers = { 1, 3, 6, 2, 2, 2, 4, 8, 4 };
        System.out.println(Arrays.toString(numbers));
        sort(numbers);
        System.out.println(Arrays.toString(numbers));
    }

    public static void sort(int[] number) {
        quicksort(number, 0, number.length - 1);
    }

    public static void quicksort(int[] array, int left, int right) {
        int lowest = left, highest = right;

        if (right - left >= 1) {
            int pivot = array[(left + right) / 2];
            // works when pivot = array[left];
            while (lowest < highest) {
                while (array[lowest] <= pivot && lowest <= right && highest > lowest) {
                    lowest++;
                }
                while (array[highest] > pivot && highest >= left && highest >= lowest) {
                    highest--;
                }
                if (highest > lowest) {
                    swap(array, lowest, highest);
                }
            }
            swap(array, left, highest); // problem area?
            quicksort(array, left, highest - 1);
            quicksort(array, highest + 1, right);
        } else {
            return;
        }
    }

    public static void swap(int[] array, int index, int index1) {
        int temp = array[index];
        array[index] = array[index1];
        array[index1] = temp;
    }

}

输出为

    [1, 3, 6, 2, 2, 2, 4, 8, 4] //unsorted
    [2, 2, 2, 1, 3, 4, 4, 6, 8] //wrongly "sorted"

1 个答案:

答案 0 :(得分:0)

根据Peter Lawrey的建议,我首先发现你的程序正确地排序了两个数字。然后尝试了三个:

    int[] numbers = { 1, 3, 6 };

在你的while循环之后你有

  • left = 0
  • lowest = 2
  • highest = 1

在这种情况下,你的评论problem area?似乎是正确的,你正在交换数字1和3,从而使它们无序。

一般来说,在你的循环之后,你知道array[left..lowest - 1]<= pivotarray[highest + 1..right]> pivot,但如果lowest == highest我认为你不能确定array[highest]是属于一个部分还是另一部分,因此您不知道是否将其交换到左侧部分。

顺便说一句,int pivot = array[left];存在同样的问题。试试int[] numbers = { 3, 1, 6 };,结果为[3, 1, 6]