簡體   English   中英

實現快速排序算法但有問題

[英]Implementing Quicksort algorithm but having problem

剛開始學習算法,試圖用 Java 實現快速排序算法,但它顯示錯誤的輸入嘗試了很多次但找不到原因。 它顯示了這個 output - 1 7 8 9 28 22 45 預期 output - 1 7 8 9 22 28 45

public class Quicksort2 {
    
    
    public static void main(String[] args) {
        int []arr= {22,9,8,45,28,7,1};
         quicksort(arr, 0, arr.length-1); 
         for(int i = 0; i<arr.length; i++)
              System.out.print(arr[i]+" ");
    }
    static void quicksort(int [] arr, int low, int high) {
        int index = partition(arr, low, high);
        
        if(low < index -1) {
            quicksort(arr, low, index -1);
        }
        if(index>high) {
            quicksort(arr, index, high);
        }
    }
    
    static int partition(int [] arr, int low, int high) {
        int pivot = arr[(low+high)/2]; 
        int i = low;
        int j = high;
        while(i<=j) {
            while(arr[i]<pivot) i++;
            while(arr[j]>pivot) j--;
            
            if(i<=j) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
        }
    }return i;
}

}

在我看來,快速排序中的第二個條件是錯誤的:

if(index>high) {
   quicksort(arr, index, high);
}

應該

if (index < high) {
  quicksort(arr, index, high);
}

用於遞增 i / 遞減 j 的內部 while 循環不遵守在父 while 循環中設置的條件i<=j

更改以下代碼:

while(arr[i]<pivot) i++;
while(arr[j]>pivot) j--;

對此:

while(i<=j && arr[i]<pivot) i++;
while(i<=j && arr[j]>pivot) j--;

您的頂級遞歸條件存在缺陷:

if (index > high) {
    quicksort(arr, index, high);
//...

這意味着數組的后半部分永遠不會被排序。

將上面的“大於”符號改為“小於”。

或者更好的是,讓你的qucksort()更緊湊:

if (low < high) {
    int index = partition(arr, low, high);
    quicksort(arr, low, index -1);
    quicksort(arr, index, high);
}

暫無
暫無

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

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