2011-03-17 116 views
0

這是我的代碼,使用選擇。我需要使用插入,並且不要使用臨時數組或ArrayList。我需要如何做插入排序的幫助。使用插入排序對象的arraylist排序

public static void sortStudents(ArrayList<Student> list) 
{//selection sort 
    Student tempStudent; 
    int count1; 
    int count2; 
    int largest; 

    for (count1=0; count1<list.size()-1; count1++) 
    { 
    largest = 0; 
    for (count2=largest+1; count2<list.size()-count1; count2++) 
    { 
    if ((list.get(largest)).compareTo(list.get(count2)) < 0) 
    { 
    largest = count2; 
    } 
    } 
    tempStudent = list.get(list.size()-1-count1); 
    list.set(list.size()-1-count1, list.get(largest)); 
    list.set(largest, tempStudent); 
    } 
} 
} 
+2

我喜歡在半夜做作業的氣味。 – whirlwin 2011-03-17 23:34:31

+0

http://en.wikipedia.org/wiki/Insertion_sort有一個很好的解釋和僞代碼,它應該足夠綽綽有餘 – Voo 2011-03-17 23:35:25

回答

0

選擇排序和插入排序的工作方式非常類似,具有列表的「尚未排序」部分和「已排序」部分。一開始,第一個是整個列表,第二個是開始或結束時的空列表。雖然排序「尚未排序」的部分收縮,而「已排序」的部分增長,每迭代一個元素。

選擇排序和插入排序的區別是這樣的:

  • 對於選擇排序,你搜索「尚未分類」部分的最小(或最大)元素,有刪除它,然後將其添加到已排序部分的結尾(或開始)。
  • 對於插入排序,您需要列表中「未排序」部分的下一個元素,在「已排序」部分找到它的插入點並將其插入到那裏。

這應該足以將您的選擇排序更改爲插入排序。

0

如果僅在循環中使用,則不在循環外定義變量。限制變量的生命週期使得代碼更容易推理。

public static void sortStudents (ArrayList<Student> list) 
{ 
    int largest; 

    for (int i=0; i < list.size() - 1; i++) 
    { 
    largest = 0; 
    for (int j=largest + 1; j < list.size() - i; j++) 
    { 
     if ((list.get (largest)).compareTo (list.get (j)) < 0) 
     { 
     largest = j; 
     } 
    } 
    Student tempStudent = list.get (list.size() - 1 - i); 
    list.set (list.size() - 1 - i, list.get (largest)); 
    list.set (largest, tempStudent); 
    } 
} 

多一點縮進讓您的代碼更具可讀性。現在你的具體錯誤是什麼 - 不編譯它,會拋出異常還是會產生錯誤的結果?

下面是一些在內部循環可疑:

largest = 0; 
    for (int j=largest + 1; j < list.size() - i; j++) 

如果設置最大的爲0,則j將被初始化爲0 + 1 => 1。我想你有另一個意圖。你的意思是j = i + 1;

+0

它編譯和運行正常。但它是一種選擇。我需要一個插入排序。我已經閱讀了關於插入的幾個註釋,並且我可以對int []進行排序。我不知道如何做arraylist 。 – whiskey 2011-03-18 00:43:16

+0

準確的問題在哪裏?您可以使用'list.size()'而不是'arr [i] - arr [j]',而使用'compareTo',而不是'arr.length'。你也知道如何交換;你應該制定一個獨立的方法,因爲它是一個明確的,可重用的工作,可以自行測試。 – 2011-03-18 01:17:50