ターン:ヒープソートアルゴリズムをより明確に説明するために、

免責事項:この記事はブロガーオリジナル記事です、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。
このリンクします。https://blog.csdn.net/u010452388/article/details/81283998
ヒープソートO(N * logN個)の時間計算量は、追加的な空間計算量はO(1)で、不安定性の一種であります

ディレクトリ

準備知識

1.1大小ルートルートヒープヒープ

ヒープソート二つの基本的な手順

2.1建設ヒープ

2.2再構成可能な固定された最大スタック

IIIは、要約したもの

4つのコード

 

準備ができて知識
スタック構造は、大小のルートルートヒープヒープに分けることができ、完全なバイナリツリー、およびヒープの並べ替えは、これに応じて設計されたソート・ヒープ・データ構造、ヒープ大小ルートのルートです何で次の第一印象ですヒープ

1.1大ルートヒープ及びスタック細根
特性:各ノードの値は左側の子および右側の子ノードの値よりも大きいが、ルートは、大きなスタックと呼ばれ、各ノードの値は、その左側の子および右側の子ノードよりも小さいです細根スタックと呼ばれる値、。下記に示すように、

 

 我々は、標識されている各図の上の数字、上記の構成は、以下のような配列にマッピングされてしまいます

 

基本的な考え方もあります。このような公知のインデックスiの数、そしてとして配列内の親ノードとノードの周りの子の数を、検索します

1.親ノードインデックス(I-1)/ 2(2によってコンピュータ、省略小数)

2.子供の左インデックス:2 * I + 1

3.右の子のインデックス:2 * I + 2

彼らは、スタックの性質の定義を満たしているのでそのため、上記の2つの配列が、山の脳の構造を作ることができます。

大根堆:ARR(I)> ARR(2 * I + 1)&& ARR(I)> ARR(2 * I + 2)

小根堆:ARR(I)<ARR(2 * I + 1)&& ARR(I)<ARR(2 * I + 2)

ヒープソート二つの基本的な手順
の基本的な考え方:

まず、アレイは大きなヒープルートに分類されるように構成され、この時点で、積層構造の最上部にアレイ全体の最大値であります

2.番号と今回の先端の交換の数が、最大数の端部は、ソートする配列の残り数がN-1であります

3.残りのn-1ルートスタックの数よりも大きくなるように再構成され、次いで上部番号及びn-1切換位置は、そう繰り返し行わ、ソートされた配列を得ることができます

2.1構成されたスタック
(小ヒープルートに下降、大きなヒープ昇順でルート)大ルートをスタックするように構成された不規則配列

次の配列を考えてみましょう

 

主なアイデア:大ルートスタック構造の第2位置は、第三の位置は保証0〜... N-までその大ルート0-2スタック構造を確保することを保証するために、0〜0大型ルートファイル構造(ナンセンス)、0~1を確実にするために最初の位置1つの大ルートファイル構造の位置(親ノードと各新たに挿入されたデータ、及び親ノード、親ノードと、スイッチ、またはより大きいポイント数の挿入が少ない親ノードまで切り替え、またはされていた場合彼は)トップに来ました

挿入されたとき6、6彼の親ノードが3よりも大きい、すなわち、ARR(1)>(0)、スイッチARR;このとき、以下に示すように0-1の位置は、大きなルート積層構造であることを確実にします。

 

                                     (ヒント:交換後の青、緑番号の数に交換されます)

 図8に示すように、挿入されたとき、次に(2)> ARR(0)、スイッチ即ちARR、8親ノード6よりも大きい。このとき、0-2位置は図以下、大型根積層構造であることを確認します。

 

5はまた、より小さい8を発見5は、挿入されたとき、その親ノード3が5より大きい場合、スイッチは、スイッチングの後、それがスイッチングされていない。このとき、0-3の位置は、図に続く、大ルートスタック構造を確保します。 

 

図7に示すように、挿入されたとき、その親ノード7は、5よりも大きい、スイッチ、切り替え後、図7および図8は、見られるよりも小さく、それがスイッチングされていない。この時点で、アレイ全体が大型ルートスタック構造を有しています 

 

 

2.2再構成可能な固定最大スタック
ポイントは、我々は大きなヒープルートを持っている、そしてトップは、為替の最後の桁の数になります、その後、残りの数はさらに大規模なルートをスタックするように設定します

 

                                    (ヒント:ブラック並べ替えに関与しなくなった、固定の良い数字です) 

 この場合、8の最大数は、最後に来て、その後固定し、数がより子供のその左上と右よりも大きい場合は、トップを動作させるために必要なデータのみの後ろに、子どもたちの大多数が比較される程度にそのトップの数を取りましたストップの数が多い、数が子どもの左右多数、為替の最上部よりも少ないし、その後に比べて子どもを以下続けば

次に図5および7を比較した下、左、右の子5、左の子7は6の右の子よりも大きい、5 <7、スイッチ;交換後5は、残りの数を記載し、彼の左の子よりも大きくなっていることがわかっ大ルートスタック構成を有する、バックは、固定された反復最大であり、そして大ルートスタックが構成します

 

図は、次の数7 7が固定され、3交換の数の上端に、

 

大ルートヒープスタート構成、数の上端及びその後交換、固定最大値、次に大きいルートスタック構造の残りの数は、上記の動作を繰り返し、最終的に順序付けられた配列を得、実施されます

 

 

IIIがまとめたもので
、ここで、私たちは、ソート・ヒープ自分の意見、上記のプロセスの私達の要約を持っている必要があります。

図1に示すように、大きなヒープルートなしで構成された第一アレイ(新たに挿入されたデータは、その親ノードと比較されます)

図2に示すように、固定された最大値は、大きな根を積層する再構成残数は、そのようなプロセスが繰り返されます

4つのコード
コード2の主な方法:

図1に示すように、アレイは大きなヒープルートに設定するソートされる(要素が上昇します)

図2に示すように、固定された最大値が、残りのルートの数が大きいスタック(要素が下がる)ように構成されています

ヒープソート//
パブリック静的ボイドヒープソート(INT [] ARR){
//スタック構成大ルート
heapInsert(ARR);
int型のサイズ= arr.length;
一方は、(サイズ> 1){
//最大固定
、0、ARR(スワップ; 1) -サイズ。
size--;
//スタック構成大ルート
; heapify(ARR、0、サイズ)

}

}

、新しく挿入された)の数によって増加//ルート大スタック構成(
パブリック静的ボイドheapInsert(INT [] ARR){
用(INT I = 0; I <arr.length; Iは++){
//現在挿入の指標
currentIndex INT ____ = I;
//親ノードインデックス
INT fatherIndex =(currentIndex - 1)/ 2;
//もし挿入の現在の値値は、その親ノード、値の交換、及び親ノードを指し示すインデックスよりも大きい
//親ノード、親ノードがループを終了し、以下であるまで、比較値以上継続
(ARR [currentIndex]> ARRながら【fatherIndex]){
//現在のスイッチング・ノードと親ノード値
スワップ(ARR、currentIndex、fatherIndex);
//現在のインデックスは、の親インデックスを指し
currentIndex = fatherIndex;
//インデックスは、親インデックス再計算され
fatherIndex =(currentIndex - 1)/ 2;
}
}
}
その他の構成の数を// (いくつかのトップによって低下)ルートスタックより大きい
パブリック静的ボイドheapify(INT [] ARR、INTインデックス、int型のサイズ){
int型左= 2 *指数+ 1、。
;右= 2 *指数+ 2 int型
ながら(<左のサイズを){
int型largestIndex;
//子が大きいインデックス値の分析(サイズ範囲でその右の子を確保するため)
(ARR [左] <ARR [右] &&右<サイズ){IF
; largestIndex =右
}さもなければ{
largestIndex =左;
}
//子の親ノードの値は、値が大きい、最大インデックスを決定
IF(ARR [インデックス]> ARR [largestIndex]){
largestIndex =指数;
}
//親ノードインデックスが最大値にインデックスである場合、それは、ループを終了し、ヒープの大きな根を有する
(インデックス== largestIndex)IF {
BREAK;
}
//親ノードは、最大値、子供の大きな値ではありません切替
;スワップ(ARR、largestIndex、指数)
より大きい子インデックス値に//インデックスである
インデックス= largestIndexが;
//子を交換インデックス再計算
左インデックス= 2 * + 1;
右インデックス= 2 * + 2;
}

}
//交換アレイ素子内の2つの値
のパブリック静的ボイドスワップ(INT [] ARR、Iは、INT、INT J){
int型ARR TEMP = [I];
ARR [I] = ARR [J]。
ARR [J] = TEMP;
}
                                                              ヒント:携帯電話を見て、スライドさせることができる 
----------------
免責事項:この記事は元の記事CSDNブロガー「ああ区の学生」、およびBY-SAの再現著作権契約、CC 4.0に従って、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/u010452388/article/details/81283998

おすすめ

転載: www.cnblogs.com/swing07/p/11444312.html