我的Java快速排序实现有什么问题?

时间:2011-08-03 15:24:08

标签: java algorithm sorting quicksort

我很确定我理解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; 
     }
}

就像现在一样,循环永远不会终止......这是一个永远的无限循环!请帮我弄清楚什么是错的。

4 个答案:

答案 0 :(得分:5)

帮自己一个忙,learn how to use a debugger。它使解决这类问题非常容易。

答案 1 :(得分:1)

您的基本情况应为if(end-start<1) - 您只想在元素数量为1时停止排序(即如果startend相等)

您的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)

一些突出的事物 -

  1. 您的结束条件似乎不正确。如果您的数组只有2个元素,则不会对它们进行排序。

  2. 此外,在进行交换后,需要增加和减少k。

答案 3 :(得分:0)

while(arr[i]<arr[pivot]&&k>i&&i<=end)

显然你有阵列索引问题。在工作的Quicksort中不需要所有这些测试,并且那些测试的顺序错误。