2013-11-26 70 views
0

我知道List<T>.SortEnumerable.OrderBy排序算法有區別。後者是穩定,這意味着元素是相等的,它保留了它們的原始順序。列表<T> .Sort和OrderBy的結果有什麼不同?

這一切都很好地重複了定義,但要教這個,我想演示一個簡單的示例,其中結果的算法不同。

我發現來到了這個例子「鑑於從最早的七個兄弟姐妹韋斯萊到最小,按名稱排序長度他們」。

var weasleys = new List<string>{"Bill", "Charlie", "Percy", "Fred", "George", "Ron", "Ginny"}; 

在這種情況下,排序依據

weasleys.OrderBy(x => x.Length) 

可以得到:羅恩,比爾,弗雷德,珀西,金妮,喬治,查理。請注意,'比爾'和'弗雷德'的長度相同,但比爾比較老,所以比爾最先。

而List.Sort

weasleys.Sort((x, y) => x.Length.CompareTo(y.Length)); 

可以得到:羅恩,弗雷德,比爾,金妮,珀西,喬治,查理。

我的例子有七個項目。有一個更簡單的情況下有更少的項目? 算法給出不同結果的最小列表是什麼?

+1

看看這個答案,HTTP://計算器。COM /問題/ 1832684/C鋒利排序和排序依據對比 – ZaoTaoBao

+0

你的實施例具有設置的一條線,這兩種情況下之間共享,並且對於每種情況一行。你可能希望多少少? –

+0

萬一別人猜錯了,請詳細說明你到底沒有在這個例子中明白了,你想怎麼有「較少的項目」。我如不猜。 – quetzalcoatl

回答

0

我不知道,但也許: 排序僅僅是一個方法。 OrderBy是擴展方法(Linq) http://msdn.microsoft.com/en-us/library/vstudio/bb383982.aspx OrderBy是稍後製作的,適用於IEnumerable。它是linq的一部分,當你想把orderby和其他linq動作結合起來時,它給了你更多的功能。

+0

無論是擴展方法或構建方法是完全inrealed。唯一重要的是底層算法。 – Andrey

+0

我以爲他問:爲什麼有2種方法做「相同」的工作。所以我認爲第一種方法是由person1設計的,第二種方法是由person2爲新系統設計的。你可以冷靜下來,我不是專家。 – zgnilec

+0

我不低調競爭的答案。但事情是,我們只能猜測原因是什麼,只有Eric Lippert跳進來才能知道,但這不太可能。所以從實際的角度來看,重要的是他們的行爲是有據可查的。 – Andrey

3

排序算法的這種屬性被稱爲stabilityList<T>.Sort明確不穩定:

此實現執行不穩定排序;也就是說,如果兩個 元素相等,則它們的順序可能不會保留。相反,穩定的排序保留了相同元素的順序。

http://msdn.microsoft.com/en-us/library/b0zbh7b6(v=vs.110).aspx

哪裏OrderBy明確穩定:

此方法執行一個穩定的排序;也就是說,如果兩個 元素的鍵相等,則元素的順序將被保留。相比之下,不穩定的排序不會保留具有相同鍵的元素 的順序。

http://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx

+0

算法給出不同結果的最小列表是什麼? –

+0

@ColonelPanic你的列表無法在.net 4.5上使用(請參閱我對該問題的評論),所以我根本無法重現它。我真的不明白你的問題的重點,你爲什麼關心這個「最小的名單」。 – Andrey

相關問題