我在下面的快速配置实施中做错了什么:
public static void quicksort(int[] array, int start, int end) {
while (start < end) {
int pIndex = partition(array, start, end);
quicksort(array, start, pIndex - 1);
quicksort(array, pIndex + 1, end);
}
}
public static int partition(int[] array, int start, int end) {
int pivot = array[end];
int pIndex = start;
for (int i = start; i <= end - 1; i++) {
if (array[i] <= pivot) {
int tmp = array[pIndex]; // swap values
array[pIndex] = array[i];
array[i] = tmp;
pIndex++;
}
}
int tmpVal = array[pIndex];
array[pIndex] = pivot;
array[end] = tmpVal;
return pIndex;
}
当针对数组{7,5,3,6,8,1,2,4}的测试用例运行时,它将数组重新排列为{1,2,3,4,8,5,7 ,6}它命令数组的左侧,但随后进入似乎是{1,2}的数组的无限循环,并且永远不会离开该递归调用。我尝试添加一个基本情况,如果array.length小于2,则返回;但这没什么区别。
这是指向code的链接。
任何人都知道可能出现什么问题?
答案 0 :(得分:2)
你的循环
for (int i = 0; i <= end - 1; i++) {
partition
内应
for (int i = start; i <= end - 1; i++) {
如果没有这个,你的pIndex可能会超出start
到end
的范围,并且你对快速排序的重复调用会有相同的参数。
上面未显示的ideone代码的另一个问题是
if (array.length < 2) { return; }
在quicksort
范围内,您不会更改数组的长度,因此array.length
始终为8。
第3个问题,导致无限循环的问题是
while (start < end) {
在quicksort
范围内,您不会在此循环期间更改start或end的值,因此此循环将永远不会退出。有关工作示例,请参阅https://ideone.com/wY23C6。
答案 1 :(得分:2)
while (start < end) {
int pIndex = partition(array, start, end);
quicksort(array, start, pIndex - 1);
quicksort(array, pIndex + 1, end);
}
应该是
if (start < end) {
int pIndex = partition(array, start, end);
quicksort(array, start, pIndex - 1);
quicksort(array, pIndex + 1, end);
}