2012-01-24 108 views
13

我寫了一個氣泡排序算法來對鏈表進行排序。我是一名Java初學者,並試圖學習數據結構。我很困惑爲什麼我的第二個元素沒有正確排序。用Java對鏈表進行排序

編輯

class SListNode { 
    Object item; 
    SListNode next; 


    SListNode(Object obj) { 
    item = obj; 
    next = null; 
    } 


    SListNode(Object obj, SListNode next) { 
    item = obj; 
    this.next = next; 
    } 

} 
public class SList { 

    private SListNode head; 
    private SListNode temp; 

    public void sortList() { 
     SListNode node = head,i,j; 
     head = node; 
     i = node; 
     j = node.next; 
     while(i.next != null) { 
      while(j.next != null) { 
       if((Integer)i.item < (Integer)j.item) { 
        temp = i.next; 
        i.next = j.next; 
        j.next = temp; 
       } 
       j = j.next; 
      } 
      i = i.next; 
     } 
    } 
} 

這是我得到

List after construction: [ 3 6 9 4 12 15 ] 
After sorting: [ 3 4 9 12 6 15 ] 

輸出此外,我知道冒泡排序的最壞情況是O(n )。我可以在鏈表上使用mergesort來獲得更好的時間複雜度嗎?

謝謝!

+0

什麼是'SListNode'?考慮發佈實施。 – paislee

+0

如果不直接回答,調查的方法是在每個交換之後以及每個外部循環之後查看System.out.println()列表以查看發生了什麼。 – user949300

回答

7

有很多排序算法在鏈表上工作,mergesort在這種情況下工作得很好。我寫了an earlier answer to a question about sorting linked lists,探索鏈表上的許多經典排序算法,以及它們的時間和空間複雜性。您可以在鏈接列表上使用插入排序,選擇排序,合併排序和快速排序。有一點欺騙,你也可以讓heapsort工作。我的舊回答詳細介紹瞭如何做到這一點。

關於您的代碼,請注意,在您的內循環中,您前進j,直到next指針變爲null。此時,您永遠不會將j重置爲其他任何內容,因此在外部循環的每個未來迭代中內部循環都不會執行。您應該在每次迭代開始時設置j = i.next。此外,當j.next爲空時,而不是j爲空時,您可能不想讓循環停止,否則會跳過數組的最後一個元素。

此外,您在這裏寫的排序算法是selection sort而不是冒泡排序,因爲你是在找你還沒有定位在最小元素的鏈表使得很多遍。我不知道這是否是一個問題,但我不確定你是否知道這一點。也就是說,我認爲這可能是一件好事,因爲在大多數情況下,冒泡排序比選擇排序效率低(除非列表已經接近排序)。

希望這會有所幫助!

+0

不是選擇排序將最小值放在第一位並迭代整個列表? – user525146

+1

@ user525146-是的,這是正確的,但這就是您的代碼目前正在做的。 :-)這不完全相同,因爲你正在做的是不斷地將較小的元素交換到第一個位置,但它具有相同的淨效果(在每次迭代中,存儲在「i」中的元素將具有最低的剩餘值)。泡泡排序會重複交換不相鄰的元素對,直到不再執行交換,但您的代碼不會執行此操作。 – templatetypedef

+0

我的交換循環有問題。結果沒有被交換。在內部循環之前,我添加了j = i.next。我在交換功能後的循環中打印出結果,看起來不起作用。 – user525146