ソートは、等しいキーを持つ要素の相対的な順序を維持する場合、安定していると言われます。私の質問は本当に、この相対的な順序を維持することの利点は何ですか?誰かが例をあげることができますか?ありがとう。
これにより、複数の条件を介してソートを「チェーン」することができます。
姓名がランダムな順序で並んだテーブルがあるとします。名で並べ替えてから姓で並べ替えると、安定した並べ替えアルゴリズムにより、同じ姓のユーザーが確実に名で並べ替えられます。
例えば:
正しい順序であることが保証されます。
重複するキーの順序を保持する場合、ソートアルゴリズムは安定しています。
OK、結構ですが、なぜこれが重要なのですか?さて、ソートアルゴリズムの「安定性」の問題は、同じデータを異なるキーに従って複数回ソートしたい場合に発生します。
データ項目に複数のキーがある場合があります。たとえば、社会保険番号や学生識別番号などの(一意の)主キーと、居住地や研究室セクションなどの1つ以上の主キーなどです。そして、そのようなデータを複数のキーに従ってソートしたい場合があります。問題は、同じデータを1つのキーに従って並べ替え、次に2番目のキーに従って並べ替えると、2番目のキーが最初の並べ替えによって達成された順序を破壊する可能性があることです。しかし、2番目のソートが安定ソートである場合、これは発生しません。
From 安定したソートアルゴリズム
優先キューはその一例です。あなたがこれを持っているとしましょう:
これを最小から最大の数に並べ替えると、不安定な並べ替えでこれが行われる可能性があります。
...しかし、「ジェーン」は「ボブ」よりも先に進んでいましたが、その逆であるはずでした。
一般に、これらは複数のエントリを複数のステップで並べ替えるのに役立ちます。
すべての並べ替えが値全体に基づいているわけではありません。人々のリストを考えてみましょう。すべての情報ではなく、名前だけで並べ替えたい場合があります。安定したソートアルゴリズムを使用すると、「John Smith」という名前の2人がいる場合、それらの相対的な順序が保持されることがわかります。
Last First Phone
-----------------------------
Wilson Peter 555-1212
Smith John 123-4567
Smith John 012-3456
Adams Gabriel 533-5574
2つの「JohnSmith」はすでに「ソート」されているので(必要な順序になっています)、位置を変更したくありません。これらのアイテムを最後に並べ替えると、最初に不安定な並べ替えアルゴリズムを使用して、次のいずれかになります。
Last First Phone
-----------------------------
Adams Gabriel 533-5574
Smith John 123-4567
Smith John 012-3456
Wilson Peter 555-1212
これは私が欲しいものです、または私はこれで終わる可能性があります:
Last First Phone
-----------------------------
Adams Gabriel 533-5574
Smith John 012-3456
Smith John 123-4567
Wilson Peter 555-1212
(2つの「ジョンスミス」が場所を入れ替えたことがわかります)。これは私が望むものではありません。
安定したソートアルゴリズムを使用した場合、最初のオプションを取得することが保証されます。これが私が求めているものです。
例:
電話番号とそれらに電話をかけた従業員のペアを含むデータ構造があるとします。番号/従業員レコードは、各通話の後に追加されます。一部の電話番号は、複数の異なる従業員から呼び出される場合があります。
さらに、リストを電話番号で並べ替えて、任意の番号に電話をかけた最初の2人にボーナスを与えたいとします。
不安定なアルゴリズムで並べ替えると、特定の番号の発信者の順序が保持されない可能性があり、間違った従業員にボーナスが与えられる可能性があります。
安定したアルゴリズムにより、電話番号ごとに適切な2人の従業員が確実にボーナスを獲得できます。
つまり、アルバムとトラック番号で並べ替える場合は、最初に[トラック番号]をクリックして並べ替え、次に[アルバム名]をクリックすると、各アルバムのトラック番号が正しい順序のままになります。
1つのケースは、複数のキーで並べ替える場合です。たとえば、名と姓のペアのリストを並べ替えるには、最初に名で並べ替えてから、姓で並べ替えます。
ソートが安定していない場合、最初のソートの利点が失われます。
複数のキーを安定して並べ替えることの利点は疑わしいため、すべてのキーを一度に比較する比較をいつでも使用できます。列見出しをクリックするときのように、一度に1つのフィールドを並べ替える場合にのみ利点があります Joe Koberg が良い例です。
レコードにシーケンス番号を追加する余裕があれば、どのソートも安定したソートに変えることができ、同等のキーが提示されたときにタイブレーカーとして使用できます。
最大の利点は、元の注文自体に何らかの意味がある場合に発生します。良い例を思いつくことはできませんでしたが、考えているうちに JeffH そうしました。
2つのフィールドを持つ入力セットでソートしていて、最初のフィールドでのみソートするとします。 '|'文字はフィールドを分割します。
入力セットには多くのエントリがありますが、次のような3つのエントリがあります。
。 。 。 AAA |けん引。 。 。 AAA |レンタカー。 。 。 AAA |配管。 。 。
これで、並べ替えが完了すると、AAAを含むすべてのフィールドが一緒になることが期待されます。
安定ソートはあなたに与えるでしょう:。 。 。 AAA |けん引AAA |レンタカーAAA |配管。 。 。
つまり、同じソートキーAAAを持つ3つのレコードは、出力では入力と同じ順序になっています。レコードの2番目のフィールドで並べ替えていないため、2番目のフィールドで並べ替えられていないことに注意してください。
不安定なソートでは、次のようになります。 。 。 AAA |配管AAA |レンタカーAAA |けん引。 。 。
レコードは引き続き最初のフィールドでのみソートされ、2番目のフィールドの順序は入力の順序とは異なることに注意してください。
不安定なソートは、より高速になる可能性があります。安定したソートは、コンピューター以外の科学者や数学以外の人々が何かをソートするときに頭に浮かぶものを模倣する傾向があります。つまり、インデックスカードを使用して挿入ソートを実行した場合、安定したソートが行われる可能性があります。
すべてのフィールドを一度に比較できるとは限りません。いくつかの例:(1)メモリ制限。大きなディスクファイルをソートしていて、メインメモリ内のすべてのレコードのすべてのフィールド用のスペースがありません。 (2)一部のオブジェクトが派生サブクラスである可能性がある基本クラスポインタのリストの並べ替え(基本クラスフィールドにのみアクセスできます)。
また、安定した並べ替えでは、同じ入力が与えられた場合に決定論的な出力があります。これは、デバッグとテストに重要な場合があります。