java中的快速排序实现错误
我在下面的快速排序实现中做错了什么:java中的快速排序实现错误,java,recursion,quicksort,Java,Recursion,Quicksort,我在下面的快速排序实现中做错了什么: 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 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;
}
publicstaticvoidquicksort(int[]数组,int开始,int结束){
while(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
}
公共静态int分区(int[]数组,int开始,int结束){
int pivot=array[end];
int pIndex=开始;
对于(inti=start;i您的循环
for (int i = 0; i <= end - 1; i++) {
如果没有此选项,您的pIndex可能超出范围start
到end
,并且您对quicksort的重复调用将具有相同的参数
编辑
上面没有显示的ideone代码的另一个问题是
if (array.length < 2) { return; }
在quicksort
中,您在循环过程中不会更改开始或结束的值,因此该循环将永远不会退出。有关工作示例,请参阅。您的循环
for (int i = 0; i <= end - 1; i++) {
while (start < end) {
int pIndex = partition(array, start, end);
quicksort(array, start, pIndex - 1);
quicksort(array, pIndex + 1, end);
}
如果没有此选项,您的pIndex可能超出范围start
到end
,并且您对quicksort的重复调用将具有相同的参数
编辑
上面没有显示的ideone代码的另一个问题是
if (array.length < 2) { return; }
在quicksort
中,在此循环期间,您不会更改start或end的值,因此此循环将永远不会退出。有关工作示例,请参阅。while(startwhile (start < end) {
int pIndex = partition(array, start, end);
quicksort(array, start, pIndex - 1);
quicksort(array, pIndex + 1, end);
}
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
应该是
for (int i = start; i <= end - 1; i++) {
if (start < end) {
int pIndex = partition(array, start, end);
quicksort(array, start, pIndex - 1);
quicksort(array, pIndex + 1, end);
}
if(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
while(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
应该是
for (int i = start; i <= end - 1; i++) {
if (start < end) {
int pIndex = partition(array, start, end);
quicksort(array, start, pIndex - 1);
quicksort(array, pIndex + 1, end);
}
if(开始<结束){
int pIndex=分区(数组、开始、结束);
快速排序(数组、开始、pIndex-1);
快速排序(数组,pIndex+1,结束);
}
这并没有修复错误,它仍然在同一个地方循环,我在链接代码中编辑。但它仍然不起作用。这并没有修复错误,它仍然在同一个地方循环,我在链接代码中编辑。但它仍然不起作用。我们是一定要使用您现有的代码,还是可以扔掉它重新开始?因为我们我们是否一定要使用您现有的代码,还是可以扔掉它重新开始?我的现有代码,因为我们正在尝试调试此实现XD