2017-07-23 22 views
0

這是按升序執行insertionSort的代碼。我正在嘗試更改代碼,以便它可以按降序排列。但每次我改變的時候都會變得更糟。有人能指出我正確的方向嗎?InsertionSort Descending排序java

public static void insertionSort(Comparable[] list) 
{ 
    for (int index = 0; index < list.length; index++) 
    { 
    Comparable key = list[index]; 
    int position = index; 

    // Shift larger values to the right 
    while (position > 0 && key.compareTo(list[position-1]) < 0) 
    { 
     list[position] = list[position-1]; 
     position--; 
    } 

    list[position] = key; 
    } 
} 
+1

你做什麼事情變得更糟? – rushi

回答

0

您當前insertionSort()函數的代碼是按升序順序排序正確。這是一個很好的基準。

我不知道你爲了做出降序的版本而嘗試做什麼改變。請在下次包含這些信息,因爲否則我們不能告訴你爲什麼它不起作用。

要改變你的函數降序排序,真正地改變單個字符:

// Sort-ascending version (current) 
key.compareTo(list[position-1]) < 0 

// Sort-descending version (proposed 
key.compareTo(list[position-1]) > 0 

我已經測試了這一變化,並證實了它的工作原理。希望這可以幫助!

+1

哇,這太容易了,我想的太複雜了,試圖改變while循環的條件,而不是隻有一個符號,但非常感謝。 – mario

0

我沒有看到您的代碼有任何大問題。我會做的是我會超過這個功能與一個人採取一個額外的參數:一個Comparatordocs here)這是用來代替自然compareTo

作爲靈感看this(類別在Java)

static <T> void sort(List<T> list, Comparator<? super T> c)根據由指定 比較器產生的順序排序的 指定列表。

要獲得降序排列,你可以打電話給你的函數類似下面:

insertionSort(A, 
       new Comparator<Integer>() { 

      @Override 
      public int compare(Integer o1, Integer o2) { 
       return o2.compareTo(o1) ; 
      }} 
     ); 
+0

你的比較器需要+1的情況。最簡單的解決方法是'返回o2.compareTo(o1);'。 – Nayuki

+0

你是對的!修正了你的建議。 –