2013-03-31 68 views
0

我創建了以下類來排序字符串數組。Java - 我的排序不起作用

public class StringSort { 
private String[] hotelNames; 
private int arrayLength; 

public void sortHotel(String[] hotelArray) { 
    if (hotelArray.length <= 1) { 
     return; 
    } 
    this.hotelNames = hotelArray; 
    arrayLength = hotelArray.length; 
    quicksort(0, arrayLength - 1); 
} 

private void quicksort(int low, int high) { 
    int i = low, j = high; 
    String first = hotelNames[low]; 
    String last = hotelNames[high];  
    String pivot = hotelNames[low + (high - low)/2]; 

    while((first.compareTo(last)) < 0) { // first is less than last 
     while((hotelNames[i].compareTo(pivot)) < 0) { // ith element is < pivot 
      i++; 
     } 
     while((hotelNames[j].compareTo(pivot)) > 0) { // jth element is > pivot 
      j--; 
     } 
     if ((hotelNames[i].compareTo(hotelNames[j])) <= 0) { 
      swap(i, j); 
      i++; 
      j--;     
     } 

     //recursive calls 
     if (low < j) { 
      quicksort(low, j); 
     } 
     if (i < high) { 
      quicksort(i, high); 
     } 
    } 
} 

private void swap(int i, int j) { 
    String temp = hotelNames[i]; 
    hotelNames[i] = hotelNames[j]; 
    hotelNames[j] = temp; 
} 

}

然而,在我的主類(一類測試StringSort),當我做:

StringSort str = new StringSort(); 
String[] hotel1 = {"zzzz", "wwww", "dddd", "bbbbb", "bbbba", "aaaf", "aaag", "zzz"}; 
str.sortHotel(hotel1); 

然後我有打印出數組的另一種方法。但是,當它打印出來時,它將原樣輸出hotel1數組,保持不變。沒有「排序」發生,我不確定我出錯的地方。

+3

你做了什麼調試?將打印輸出添加到swap()並查看它是否在執行您期望的交換。 –

+0

沒有調試抱歉,仍然在學習這樣做。 – Khalid

+0

我認爲compareTo比較合適,因爲它比較字符串的字典順序。 – Khalid

回答

6

,我們在您實現快速排序的幾個問題:

  1. 首先/最後的比較。只要第一個元素小於最後一個元素,無論其他順序如何,此代碼都將使您的快速排序不做任何操作。

    while((first.compareTo(last)) < 0) { // first is less than last 
    
  2. 交換前檢查。這條線路是不必要的:

    if ((hotelNames[i].compareTo(hotelNames[j])) <= 0) { 
    

你真正想要做的是看是否i仍低於j和救助循環即可。如果沒有,然後交換。在完成分區循環之後,只要每個子數組中有兩個以上的元素,就可以進行遞歸調用。

+0

謝謝,我知道那條線是狡猾的,我把我的指針i和j混淆了高/低。我改變了它,現在它工作。我正在把這個類的另一個quicksort作爲整數的基礎,這讓我和i和j有點混淆。謝啦。 – Khalid

+1

太棒了!請注意,可能存在潛在的其他問題:您的算法可能會對包含大量模糊的數據以及已排序的數據執行嚴重錯誤。 – angelatlarge

+0

在將其實施到我的程序中之前,我將對其進行徹底測試,謝謝您指出。我喜歡這個網站! – Khalid