並べ替えアルゴリズムの安定性と不安定性の分類

      過去数日間、筆記テストをいくつか試しましたが、一般的な並べ替えアルゴリズムの安定性に問題がありました。複数の選択肢を選択することがよくあります。私やクラスメートが不確かな場合は、簡単な質問ではありません。もちろん筆記テストの前に、安定しているデータ構造ブックと安定していないデータ構造ブックを覚えている場合は、簡単に実行できます。この記事は、これを思い出せない、またはなぜそれが安定しているか不安定なのかを本当に理解したい人のためのものです。

      まず、誰もが並べ替えアルゴリズムの安定性を知っている必要があります。簡単に言えば、並べ替えシーケンスの最初の2つの等しい数が、並べ替えの前後で同じ順序の位置になることを保証できます。単純な定式化では、Ai = Ajの場合、Aiはもともと位置の前にあり、ソート後も、AiはAjの位置の前にある必要があります。

      次に、安定性の利点について話します。ソートアルゴリズムが安定している場合は、1つのキーからソートしてから、別のキーからソートします。最初のキーソートの結果を2番目のキーソートに使用できます。カーディナリティの並べ替えは次のように行われます。最初に低位で並べ替え、次に高位で並べ替えます。低位が同じ要素は、高位で同じ順序であっても変わりません。また、並べ替えアルゴリズムが安定している場合、比較ベースの並べ替えアルゴリズムでは、要素の交換回数が少なくなる可能性があります(個人的な感覚、確認なし)。

トピックに戻り、単純な理由で、一般的な並べ替えアルゴリズムの安定性を分析します。

(1)バブルソート

バブルソートとは、小さな要素を前方に調整したり、大きな要素を後方に調整したりすることです。比較は2つの隣接する要素の比較であり、これら2つの要素間でも交換が行われます。したがって、2つの要素が等しい場合、それらを退屈に交換することはないと思います。2つの等しい要素が隣接していない場合、2つが以前のペアワイズ交換で互いに隣接していても、これは現時点では交換は行われないため、同じ要素の順序は変更されないため、バブルソートは安定したソートアルゴリズムです。

(2)選択ソート

選択の並べ替えでは、各位置の最小要素を選択します。たとえば、最初の位置の最小要素を選択し、残りの要素の中で2番目の要素の2番目に小さい要素を選択します。以下同様に、n-1要素まで最大の要素のみが残るため、n個の要素を選択する必要はありません。次に、単一の選択で、現在の要素が要素より小さく、現在の要素と等しい要素の後ろに小さい要素が表示される場合、交換後の安定性は失われます。たとえば、シーケンス5 8 5 2 9.などの食欲をそそります。最初のパスで最初の要素5を選択すると2と交換されることがわかっているため、元のシーケンスの2つの5の相対的な順序は破棄されるため、選択順序は異なります。安定したソートアルゴリズム。

(3)挿入の並べ替え
挿入の並べ替えは、最初の挿入要素で既に順序付けされている小さなシーケンスに基づいています。もちろん、最初は、この小さな順序付けされたシーケンスには、最初の要素である1つの要素しかありません。比較は、順序付けられたシーケンスの最後から開始されます。つまり、挿入する要素は、順序付けされた最大の要素と比較されます。それより大きい場合は、そのすぐ後ろに挿入されます。それ以外の場合は、挿入する必要がある要素が見つかるまで前方に検索されます。ポジション。挿入された要素と等しいものが見つかった場合、挿入された要素は、挿入する要素を等しい要素の後に配置します。したがって、等しい要素の順序は変更されておらず、元の順序付けされていないシーケンスからの順序はソート後の順序なので、挿入ソートは安定しています。

(4)
2方向のクイックソートクイックソート、添え字iはすぐに残されています。[i] <= a [ center_index]の場合、添え字center_indexは配列の中心要素であり、配列は通常0と見なされます。要素。また、右側のj添え字は、a [j]> a [center_index]の場合、左端まで移動します。iとjが移動できない場合、i <= j、a [i]とa [j]を交換し、上記のプロセスをi> jまで繰り返します。a [j]とa [center_index]を交換して、クイックソートを完了します。中央の要素とa [j]を交換すると、前の要素の安定性が損なわれる可能性が非常に高くなります。たとえば、シーケンスは5 3 3 4 3 8 9 10 11であり、現在は中央の要素5と3(5番目の要素、下付き文字は1)から始まります。交換により要素3の安定性が損なわれるため、クイックソートは不安定なソートアルゴリズムであり、中央の要素とa [j]を交換するときに不安定になります。

(5)マージソート
マージソートは、短いシーケンスのシーケンスに再帰的に分割されます。短いシーケンスの再帰は、1つのアウトレット要素(直接順序付けされたもの)または2つのシーケンス(比較およびスワップ1)であり、次にそれぞれのセグメントが順序付けられます。シーケンスは順序付けられた長いシーケンスにマージされ、元のシーケンスがすべてソートされるまでマージを続けます。要素が1つまたは2つある場合、1つの要素は交換されず、2つの要素のサイズが等しい場合、意図的にそれを交換することはありません。次に、短い順序のシーケンスをマージするプロセスで、安定性が損なわれますか?いいえ、マージプロセス中に、2つの現在の要素が等しい場合、前のシーケンスの要素を結果シーケンスの前に保存することで、安定性を保証できます。したがって、マージソートも安定したソートアルゴリズムです。

(6)基数ソート
基数ソートは、最初に低い順にソートされてから収集され、次に高い順にソートされ、次に収集されます。一部の属性には優先順位があり、最初に低い優先順位でソートされ、次に高い優先順位でソートされます。最終的な順序は最初に高い優先順位、同じ優先順位の低い優先順位です。カーディナリティの並べ替えは、個別の並べ替えと個別の収集に基づいているため、安定した並べ替えアルゴリズムです。

(7)ヒルソート(シェル)
ヒルソートは、非同期の長さによる要素の挿入ソートです。最初に要素が非常に無秩序である場合、ステップサイズが最も大きいため、挿入ソートの要素の数は少なく、速度は非常に高速です。 ;要素が基本的に順序付けされていて、ステップサイズが小さい場合、挿入ソートは順序付けられたシーケンスに対して非常に効率的です。したがって、Hillソートの時間の複雑さはO(n ^ 2)よりも優れています。複数の挿入ソートがあるため、1つの挿入ソートは安定しており、同じ要素の相対的な順序は変更されません。ただし、異なる挿入ソートプロセスでは、同じ要素がそれぞれの挿入ソートで移動する可能性があり、最終的にそれらの安定性は破壊されたため、シェルのソートは不安定です。

(8)ヒープ
構造は、ヒープ構造が子ノードであることを知っています。iは2 * iおよび2 * i + 1ノードです。大きなトップスタックでは、親ノードが2つの子ノード以上である必要があり、小さなトップスタックでは親が2以下である必要があります。子ノード。長さnのシーケンスでは、ヒープの並べ替えのプロセスは、n / 2と3つの値を持つその子ノードから最大(大きいトップヒープ)または最小(小さいトップヒープ)を選択し、これら3つの要素から選択します。もちろん、安定性を損なうことはありません。ただし、n / 2-1、n / 2-2、... 1の親ノードの要素を選択すると、安定性が失われます。n / 2番目の親ノードが次の要素を交換し、n / 2-1番目の親ノードが同じ要素を交換しない可能性があります。これら2つの同じ要素間の安定性は、破壊されました。したがって、ヒープソートは安定したソートアルゴリズムではありません。

要約すると、選択ソート、クイックソート、ヒルソート、ヒープソートは安定したソートアルゴリズムではなく、バブルソート、挿入ソート、マージソート、基数ソートは安定したソートアルゴリズムであると結論付けられます。

おすすめ

転載: blog.csdn.net/kerwinJu/article/details/78675624