Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以轴心点作为中间点而不是第一个索引的快速排序错误_Java_Algorithm_Debugging_Pivot_Quicksort - Fatal编程技术网

Java 以轴心点作为中间点而不是第一个索引的快速排序错误

Java 以轴心点作为中间点而不是第一个索引的快速排序错误,java,algorithm,debugging,pivot,quicksort,Java,Algorithm,Debugging,Pivot,Quicksort,快一点。当pivot是中间值时,我很难让这段代码正常工作。我知道当轴是最左边的值时,它会起作用。需要帮忙吗 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(num

快一点。当pivot是中间值时,我很难让这段代码正常工作。我知道当轴是最左边的值时,它会起作用。需要帮忙吗

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;
    }

}

根据Peter Lawrey的建议,我首先观察到您的程序对两个数字进行了正确排序。然后尝试了三个:

    int[] numbers = { 1, 3, 6 };
在你的while循环之后

  • =0
  • 最低值
    =2
  • 最高值
    =1
在这种情况下,您的注释
问题区域?
似乎是正确的,因为您正在交换数字1和3,从而使它们无序

通常,在循环之后,您知道
array[left..lower-1]
pivot
,但是如果
lower==highest
,我认为您无法确定
array[highest]
是否属于一个部分,因此您不知道是否将其交换到左侧部分


顺便说一下,您在
intpivot=array[left]上也有同样的问题。试试
int[]numbers={3,1,6},结果是
[3,1,6]

我建议您找到最简单的失败示例,并在调试器中逐步完成代码(这是我必须做的)这看起来像是一些家庭作业。。。在任何情况下,都要学会调试,找出哪里出了问题。如果你不知道任何调试器都使用最粗糙的方式打印东西。问题是我确实花了好几个小时在这上面,但无法让1从一开始就改变。标记为“问题区域”的
swap
调用的理由是什么?这看起来像是从另一个分区算法中错误地包含了它。@rici因为我试过运行代码,我认为是那个区域把它搞砸了。。但问题是我不知道在那里交换哪些变量
    int[] numbers = { 1, 3, 6 };