2012-11-18 55 views
0

林與我的鏈接列表中選擇排序如下:的選擇不正確的排序輸出鏈接上有故障列表

public static void selectionSort(LN l) { 
    for (LN r = l; r != null; r = r.next) { 
     LN min = r; 
     for (LN s = r; s != null; s = s.next) 
      if (min.value > s.value) 
       min = s; 
     LN temp = r; 
     r.value = min.value; 
     min.value = temp.value; 
    } 
} 

所以對於輸入:10,4,6,2,1,7,9,8, 5,3 我得到的輸出:1,1,1,1,1,3,3,3,3,3

這裏的排序有什麼問題?

+0

什麼是錯用'while'循環? –

+2

什麼是'LN'? – alestanis

+0

這是一個ListNode對象。 – user1766888

回答

2

此:

 LN temp = r; 
     r.value = min.value; 
     min.value = temp.value; 

是錯誤的。通過設置temp等於r,實際上是讓它們引用同一個對象;因此修改r.value等同於修改temp.value。所以上述結果並沒有真正修改min.value;它只是設置min.value它已經是。

相反,你應該寫:

 int temp = r.value; 
     r.value = min.value; 
     min.value = temp; 
+0

OP不能使用getter/setters來做這個嗎? – siebz0r

+0

@ siebz0r:吸氣者通常被寫成與基礎字段和設置者相當,以便相當於分配給它。 'r.setValue(min.getValue())'和'min.setValue(temp.getValue())'不會真的改變任何東西。或者你的意思是別的嗎? – ruakh

+0

是不是一個setter按值而不是按照引用設置,從而解決問題? – siebz0r