NSArray のさまざまな並べ替え方法で使用される並べ替えアルゴリズムは安定していますか? (同じソートキーを持つアイテムの相対的な順序が保持される「安定したソート」アルゴリズムと同様です。)
3 に答える
を使用しない限り、安定ソートは保証されませんNSSortStable
。NSSortOptionsのドキュメントから:
NSSortStable
並べ替えられた結果が、最初に発生した順序で等しい値を持つ比較項目を返す必要があることを指定します。
このオプションが指定されていない場合、等しいオブジェクトは元の順序で返される場合と返されない場合があります。
安定した並べ替えを保証する必要がある場合は、次のようにしてみてください。
[array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
これについて私が見つけた唯一の「公式」回答は、Apple の Chris Kane による2002 年のメーリング リストの投稿です。
NSArray/NSMutableArray のソート方法の安定性は未定義であるため、不安定であることを予測する必要があります。未定義であるため、リリースごとに状況が変わる可能性もありますが、私自身はそうなるとは予想していません。現在の実装では、BSD の qsort() ルーチンとほぼ同じアルゴリズムのバージョンであるクイック ソートを使用しています。一連の実験の結果、ある時点で、テストで使用した一般的な種類のデータよりも優れた結果を出すのは難しいことがわかりました。[もちろん、ソートされているデータに関する追加情報がある場合は、その場合に役立つ他のアルゴリズムまたは変更を使用できます。]
投稿が古いことを考えると、これがまだ正しいかどうかはわかりませんが、NSArray
の並べ替え方法は安定していないと想定するのがおそらく最善です。
docでは、同一のアイテムの最終的な注文に関する詳細は示されていません。
したがって、順序について何らかの仮定をすることは悪い考えだと思います。順序を実験的に決定したとしても、配列内のアイテムの数や並べ替えを実行する iOS のバージョンによって変わる可能性があります。
私にとっては、ドキュメンテーションによって提供される約束を守ります。