簡體   English   中英

我的Java quicksort實現有什么問題?

[英]What is wrong with my Java quicksort implementation?

我很確定我了解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; 
     }
}

現在,循環永遠不會終止……這是一個永遠的無限循環! 請幫助我找出問題所在。

幫自己一個忙, 學習如何使用調試器 它使解決此類問題變得非常容易。

您的基本情況應該是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);

幾件引人注目的事情-

  1. 您的最終狀況似乎不正確。 如果您的數組只有2個元素,則不會對它們進行排序。

  2. 同樣,在執行交換之后,您需要遞增i並遞減k。

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

顯然,您遇到了數組索引問題。 運行正常的Quicksort並不需要所有這些測試,而且順序錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM