web-dev-qa-db-ja.com

ヒープソートが安定しないのはなぜですか?

ヒープソートが安定していない理由を理解しようとしています。私はこれをグーグルで調べましたが、良い、直感的な説明は見つかりませんでした。

安定した並べ替えの重要性を理解しています-複数のキーに基づいて並べ替えることができます。これは非常に有益です(つまり、それぞれ異なるキーに基づいて複数の並べ替えを行います。すべての並べ替えは要素の相対的な順序を保持するため、以前の並べ替えを合計すると、複数の条件で並べ替えられた要素の最終リストが得られます)。しかし、なぜヒープソートもこれを保持しないのでしょうか?

ご協力いただきありがとうございます!

27
JMS

ヒープソートの結果の最終シーケンスは、(キーフィールドに基づいて)作成されたヒープから純粋なサイズの順序でアイテムを削除することから来ます。

最初に来たヒープ作成段階で、元のシーケンスのアイテムの順序に関する情報は失われました。

23
Baldrick

ヒープソートの不安定な例

配列21 20a 20b 12 11 8 7(すでに最大ヒープ形式で)

ここに 20a = 20b単にそれらを表す順序を区別するために20aおよび20b

最初にヒープソート21が削除され、最後のインデックスに配置されてから20aは削除され、最後から2番目のインデックスと20b最後の2つのインデックスにあるため、ヒープソート後、配列は次のようになります

7 8 11 12 20b 20a 21

要素の順序は保持されないため、安定することはできません

39
KD157

安定とは、2つの要素が同じキーを持っている場合、同じ順序または位置のままであることを意味します。しかし、ヒープソートの場合はそうではありません。

Heapsortは、ヒープに対する操作により、等しいアイテムの相対的な順序が変更される可能性があるため、安定していません。

ここ から:

(昇順で)ソートする場合、heapsortは最初に最大の要素をピークにして、リストの最後に配置します。そのため、最初に選択された要素は最後に残り、2番目に選択された要素はソートされたリストの最後から2番目の要素に残ります。

繰り返しますが、Build-Max-Heapプロシージャは、ヒープツリーの構築時に同じ値の順序(例:3a、3b)を保持するように機能します。最大要素を抽出するために、ルートからも機能し、ツリーの構造を保持しようとします(Heapifyの変更を除く)。

そのため、同じ値[3a、3b]を持つ要素の場合、heapsortは3bの前に3aを選択しますが、3aを3bの右側に配置します。したがって、リストが昇順でソートされると、リストの3aの前に3bが取得されます。

(3a、3b、3b)でヒープソートを試みると、状況を視覚化できます。

18
Rahul Tripathi

安定した並べ替えアルゴリズムは、入力の繰り返し要素の順序が出力でも維持されるように要素を並べ替えます。

ヒープソートには2つのステップが含まれます。

  • ヒープ作成
  • ヒープツリーからルート要素を削除して、新しい配列に追加します。この配列は順番にソートされます

1。ヒープ作成中の順序の中断

入力配列が{1、5、2、3、2、6、2}であり、2の順序を見るために2a、2b、2cであるとすると、配列は{1、5、 2a、3、2b、6、2c}

そこからヒープ(ここでは最小ヒープ)を作成すると、その配列表現は{1、2b、2a、3、5、6、2c}になります(2aと2bの順序は既に変更されています)。

2。ルート要素の削除中の順序の中断

ここで、ヒープからルート要素(この場合は1)を削除して別の新しい配列に入れる必要がある場合、それを最後の位置と交換してそこから削除し、ヒープを{2c、2b、2a、 3、5、6}。同じことを繰り返します。今回は、ヒープから「2c」を削除し、「1」を配置した配列の最後に配置します。

ヒープが空になり、すべての要素が新しい配列に転送されるまでこの手順を繰り返し終えると、新しい配列(ソート済み)は{1、2c、2b、2a、3、5、6}のようになります。

ヒープソートへの入力: {1、5、2a、3、2b、6、2c}-> 出力: {1、2c、2b、2a、3 、5、6}

そのため繰り返し要素(2)は、ヒープソートされた配列では入力に現れる順序と同じではないため、ヒープソートは安定していません!

1
user0904

サイズn(任意の値)の配列を取り、ヒープに2つの連続した要素がある場合(15と仮定)、それらの親インデックスが4および20のような値を持つ場合(これは実際の順序(.... 4,20 、.....、15,15 .....)。4と1番目の15の相対的な順序は同じままですが、20> 15の場合、2番目の15はヒープソートアルゴリズムで定義されているように前面(スワップ)になります。相対的な順序はなくなりました。

1

これが遅い回答であることは知っていますが、ここに2セントを追加します。 3つの整数の単純な配列を考えます。 2,2,2では、build max heap関数を使用して最大ヒープを構築する場合、入力を格納している配列は既に最大ヒープ形式であるため変更されていないことがわかります。ヒープソートの最初の繰り返しで、ツリーのルートを配列の最後に配置すると、配列の安定性はすでに失われています。ヒープソートの不安定性の簡単な例があります。

0
dipen bhatt