快一点。当枢轴是中间值时,我努力使这个代码工作。我知道当枢轴是最左边的值时它会起作用。有什么帮助吗?
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"
答案 0 :(得分:0)
根据Peter Lawrey的建议,我首先发现你的程序正确地排序了两个数字。然后尝试了三个:
int[] numbers = { 1, 3, 6 };
在你的while循环之后你有
left
= 0 lowest
= 2 highest
= 1 在这种情况下,你的评论problem area?
似乎是正确的,你正在交换数字1和3,从而使它们无序。
一般来说,在你的循环之后,你知道array[left..lowest - 1]
是<= pivot
而array[highest + 1..right]
是> pivot
,但如果lowest == highest
我认为你不能确定array[highest]
是属于一个部分还是另一部分,因此您不知道是否将其交换到左侧部分。
顺便说一句,int pivot = array[left];
存在同样的问题。试试int[] numbers = { 3, 1, 6 };
,结果为[3, 1, 6]
。