.NET 4.5改變的Array.Sort的實施,以所謂的「內省排序」,這是一個混合算法,其由快速排序,插入排序,並堆排序取決於輸入數據之間進行選擇的。在此詳細介紹:是.NET 4.5反省Array.Sort確定性的實現嗎?
http://msdn.microsoft.com/en-us/library/6tf1f0bc(v=vs.110).aspx
這是有據可查的是,排序是「不穩定」,這意味着含有相同的排序順序值可能會或可能不會保留原始輸入順序的兩個元素。但是,我需要知道它是否爲「確定性」,因爲任何任意輸入數據在每次排序時都會以可重複方式返回相同的輸出數據。具體來說,我知道快速排序可以以確定性或非確定性(如果樞軸是隨機選擇的)實現,但我不確定哪些實現用於.NET的內省排序。
從我的測試中,它似乎是確定的,因爲我還沒有看到任何特定數據集運行之間返回不同,但因爲你還沒有看到它顯然你無法證明的東西不只是存在: -/
我想我打算看代碼,以幫助揣摩內省排序是否是確定的,但我希望有人知道這裏的副手,並能拯救我的努力;)
謝謝! 瑞安
不,這就是「不穩定」的意思。如果相等比較器的選擇性不夠,那麼任意輸入數據不會以相同的順序重複排序。 –
如果它沒有記錄在算法是確定性的'Array.Sort'頁面上,依賴它是非常危險的。畢竟,你剛看到4.5改變算法。它可以再次改變。 – usr
HansPassant - 我的意思是,在相同的輸入(任意輸入)下,它將以相同的順序重複排序。 @usr - 不幸的是,有人基本上依靠它在4.0中是確定性的,現在我們升級了我們發現的差異。我們想要做的就是編譯4.0版本,然後使用相同的集合來恢復我們所得到的結果,我們只是想確保當我們這樣做時,我們可以依靠與之前相同的排序。換句話說,在4.0確定性中是quicksort實現Array.Sort? – user3365745