我很确定我理解quicksort是如何工作的,但我找不到导致我尝试实现它的错误。我已经仔细研究了几个小时,无法弄清楚出了什么问题。请帮我!这是整个文件(它只是快速排序 - 没有什么额外的。数组只是用于测试快速排序的随机数字。)
public class Quicksort{
public static void main(String args[]){
int[] arr = {5,1,4,3,7,0,9,2,6,8};
quicksort(arr, 0, arr.length-1);
for(int x : arr)
System.out.print(x+" ");
}
public static void quicksort(int[] arr, int start, int end){
if(end-start<2)
return;
int pivot = (end-start)/2;
int i = start;
int k = end;
while(k>i){
while(arr[i]<arr[pivot]&&k>i&&i<=end)
i++;
while(arr[k]>arr[pivot]&&k>=i)
k--;
if(k>i){
swap(arr, i, k);
}
}
swap(arr, pivot, i);
quicksort(arr, 0, i);
quicksort(arr, k, arr.length-1);
}
public static void swap(int[] a, int x, int y){
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
}
就像现在一样,循环永远不会终止......这是一个永远的无限循环!请帮我弄清楚什么是错的。
答案 0 :(得分:5)
帮自己一个忙,learn how to use a debugger。它使解决这类问题非常容易。
答案 1 :(得分:1)
您的基本情况应为if(end-start<1)
- 您只想在元素数量为1时停止排序(即如果start
和end
相等)
您的while循环应该只是while(arr[i]<arr[pivot])
和while(arr[k]>arr[pivot])
此
if(k>i){
swap(arr, i, k);
}
应该是
if(k>=i){
swap(arr, i, k);
i++;
k--;
}
swap(arr, pivot, i);
是不必要的。
您的递归通话应为quicksort(arr, start, k);
和quicksort(arr, i, end);
答案 2 :(得分:1)
一些突出的事物 -
您的结束条件似乎不正确。如果您的数组只有2个元素,则不会对它们进行排序。
此外,在进行交换后,需要增加和减少k。
答案 3 :(得分:0)
while(arr[i]<arr[pivot]&&k>i&&i<=end)
显然你有阵列索引问题。在工作的Quicksort中不需要所有这些测试,并且那些测试的顺序错误。