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