我已经用Java编写了我的Quick Sort版本但是在调用第二次递归时我遇到了一些问题。这是我的代码:
public static int[] quickSort(int[] array, int start, int end) {
int pIndex;
if (start < end) {
int left = start;
int right = end - 1;
int pivot = array[end];
//Start the partitioning
while (left < right) {
if (array[left] > pivot && array[right] < pivot) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
left++;
right--;
} else if (array[left] > pivot)
right--;
else
left++;
}
if (array[end] < array[left]) {
int temp = array[left];
array[left] = array[end];
array[end] = temp;
pIndex = left;
} else
pIndex = end;
//End partitioning
quickSort(array, 0, pIndex - 1);
quickSort(array, pIndex + 1, array.length - 1);
}
return array;
}
参数start将是数组中第一个元素的索引,end将是最后一个元素的索引,我选择最后一个元素作为数据透视。
我遇到的问题是 quickSort(array,pIndex + 1,array.length - 1);
array.length-1导致它无限地继续,因为它引用了原始数组。我有没有办法解决这个问题而不必每次都将新数组传递给函数?
我确实尝试创建一个全局变量来存储新的长度,但我无法做到这一点。
提前致谢。
如果代码不是Sort的非常好的实现,我很抱歉。我想自己一个人写一个,但结果我遇到了问题。
答案 0 :(得分:1)
在QuickSort中使用递归的正确方法是使用start
,pivot
和end
。
您似乎正在使用包容性结束索引;然后你会想要进入
quicksort(data, start, pivot - 1)
quicksort(data, pivot + 1, end)
枢轴元素已经处于最终位置。