2012-05-07 529 views
10

NSArray stable中的各種排序方法是否使用排序算法? (因爲它們是「穩定排序」算法,其中具有相同排序鍵的項目保留其相對順序。)NSArray使用的排序算法是否穩定排序?

+1

你試試看? –

+6

@TDeBailleul「給它一個嘗試」在這種情況下並不真正有用。在某些情況下,排序可能是穩定的,但在其他情況下,排序可能是穩定的,這取決於數據的大小,陣列的構建方式等。 – omz

+0

好吧,我認爲行爲總是一樣的。很高興知道。 –

回答

4

doc中,沒有給出關於相同項目的最終順序的細節。

所以,我覺得作出有關的秩序將是一個壞主意任何假設。即使您通過實驗確定訂單是什麼,這可能會根據數組中的項目數量或iOS的哪個版本進行排序來更改。

對於我來說,我會堅持與文檔所提供的承諾。

+0

即使我已經徹底測試過了,我也不會相信它,Apple可能會在下一個版本中更改使用的算法,使得任何測試都毫無意義,並可能導致一些奇怪的錯誤。 – JustSid

+4

文檔*確實指定了它,它只是隱藏在'NSSortOptions'的文檔之後:https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference。 html#// apple_ref/doc/c_ref/NSSortOptions – wxactly

5

唯一的「官方」的答案,我發現這個是一個2002 mailing list post由克里斯·凱恩從蘋果:

的NSArray/NSMutableArray裏的排序方法的穩定性是不確定的, 所以你應該預料到他們不穩定。由於未定義,所以 的情況可能也會隨着發佈而變化,但我並不是 (我)預計這很可能。目前的實現 使用快速排序,該算法的一個版本幾乎與BSD的qsort()例程相同。實驗一束在一個點上發現它 很難通過一般類型的數據,我們 在測試做的更好。 [當然,如果一個人有更多的信息 有關數據進行排序,可以使用其他算法或 修改有助於這種情況。]

我不知道這是否仍然是正確的,給予多大該帖子是,但它可能是最好的假設NSArray的排序方法是不是穩定。

16

穩定的排序不能保證,除非你用NSSortStable。從documentation on NSSortOptions

NSSortStable

指定排序的結果應返回的項目相比,在他們最初發生的順序同等價值。

如果該選項未被指定等於對象可能或可能不會在原來的順序返回。

如果你需要保證一個穩定的排序,你可以試試:

[array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2]; 
}]; 
+0

'(void)sortWithOptions:usingComparator:'適用於可變數組... ...還有'(NSArray *)sortedArrayWithOptions:usingComparator:'如果那浮起你的船 – wxactly