Java 为什么这种快速排序分区方法是错误的?

Java 为什么这种快速排序分区方法是错误的?,java,sorting,quicksort,Java,Sorting,Quicksort,我有一个快速排序分区方法。 但我不明白为什么这是错的 方法如下: private static <E extends Comparable<E>> int partition(E[] list, int first, int last) { int pivotIndex = (first + last) / 2; E pivot = list[pivotIndex]; // Choose the first element as the pivot

我有一个快速排序分区方法。 但我不明白为什么这是错的

方法如下:

private static <E extends Comparable<E>> int partition(E[] list, int first, int last) {
    int pivotIndex = (first + last) / 2;
    E pivot = list[pivotIndex]; // Choose the first element as the pivot
    swap(list, last, pivotIndex);
    pivotIndex = last;
    last--;
    do {
        // Search forward from left
        while (first < last && list[first].compareTo(pivot) <= 0)
            first++;
        // Search backward from right
        while (first <= last && list[last].compareTo(pivot) > 0)
            last--;

        // Swap two elements in the list
        if (last >= first) {
            swap(list, first, last);
            first++;
            last--;
        }
    } while (last > first);

    swap(list, pivotIndex, first);

    return first;
}
我知道bug存在于do-while循环中,但我不知道原因和方式。我不需要正确版本的分区方法。。。我只是想知道为什么这个是错的。例如,如果我想对[12 28 79 19 60 22 3 50 75 60 25 97 98 12 88]进行排序,它会给我[3 12 19 22 25 12 28 50 60 75 79 88 98],这是错误的…

在第一行

int pivotIndex = (first + last) / 2;
数据透视索引现在保持中间元素的位置

E pivot = list[pivotIndex];
现在将该值指定给pivot

也许这就是你的代码给出错误答案的原因

它只是将小于50的元素(即中间元素)向左放置,将大于50的元素向右放置。

在第一行

int pivotIndex = (first + last) / 2;
数据透视索引现在保持中间元素的位置

E pivot = list[pivotIndex];
现在将该值指定给pivot

也许这就是你的代码给出错误答案的原因


它只是将小于50的元素(即中间元素)向左放置,将大于50的元素向右放置。

提示:此类任务非常适合TDD。。。意思是:在开始编写解决方案之前编写测试用例。通过走这条路,您首先从小测试用例开始。你看-这可能更容易找出这里的错误。。。当你有单元测试。。。也可以在调试器中为包含1、2、3个元素的数组运行;而不是去举一个更大的例子。。。顺便提一下,这个问题很好!提示:这样的任务非常适合TDD。。。意思是:在开始编写解决方案之前编写测试用例。通过走这条路,您首先从小测试用例开始。你看-这可能更容易找出这里的错误。。。当你有单元测试。。。也可以在调试器中为包含1、2、3个元素的数组运行;而不是去举一个更大的例子。。。顺便提一下,这个问题很好!