1、簡単なヒープソートアルゴリズム
名前はカザフスタン、ヒープソートアルゴリズムは、このデータ構造設計のためのヒープアン・アルゴリズムを使用することであることを示唆しているとして、インターネット上のヒープソートアルゴリズムを説明するために多くの情報を見つけることができますが、私はブログを書くために、独自の自分の理解に学んでいるので、私はブログのいくつかの私の知識では唯一の臨界点。
キー知識ポイントは、ソートアルゴリズムヒープ:
- 時間の複雑さは:最高の状態で、最悪の事態は、平均的な場合の時間の複雑さはO(nlogn)です。
- 安定性:不安定なソートアルゴリズムであります
- スタックとヒープ大ルート根ヒープに、ヒープ・ソート・アルゴリズム対応するヒープソートアルゴリズムが大と小根の根ヒープソートアルゴリズムに分割されています
- 大ルートヒープソートアルゴリズムは、昇順ソートに対応する、ヒープソートアルゴリズムを降順細根を対応します
ヒープソートアルゴリズムの2、基本
ヒープソートアルゴリズムは、ヒープデータ構造を使用する必要があります。
ヒープは、以下の特性を有する完全二分木である:各ノードの値は、左と右の子ノードの値以上であると呼ばれる大型のトップスタックと、各ノードまたはより少ないまたはその左の子ノードに等しい値小さなスタックトップとして知られている値は、。完全2分木であるかについての知識のバイナリツリーは完全なバイナリツリーなど、この基礎の基礎を教えています。
ヒープは、完全二分木であるため、完全なバイナリツリーは、このときアレイの使用は、種々の二分木ノードの配列の添字の間の関係を反映することができるので、私たちは、ストレージアレイを使用することができます。このように、私たちは、子供の周りのノードは、ノードの配列のインデックスに応じて直接配列添字の子ノードを取得することができる見つけます。換言すれば、論理二分木構造は、間接的に配列インデックスによって反映させることができます。
大顶堆:ARR [I]> = ARR [2I + 1] && ARR [I]> = ARR [2I + 2]
小顶堆:[I] <= ARR [2I + 1] && ARR [I] <= ARR [2I + 2] ARR
3、ヒープソートアルゴリズムの基本的な考え方
- ステップ:大ルートヒープまたは根リアクタの構築:ので配列の配列の開始は、特性のスタックと一致していない大ルートヒープまたは根スタックを満たす満たすように、それは、アレイ内の適切な調整データとの対応関係の添字を必要とします調整は、調整を開始つの非リーフ・ノードから上方一つ最後のものである特性。
- ステップ2:スタック要素とスイッチング素子の上部の端、ように最大エンド要素(例えば、大きなヒープルートを使用して)。交換の後、すでに良いための最後の要素に相当します。アレイは大きな根ヒープので、最終的に最大の要素であるため、最終結果は、昇順にソートされます
- ステップ3:スタックの最初の要素を実行することは、必ずしもエンド・ステップを特徴二ヒープの並べ替えを満たしていない、第1のノードは、第2大要素を与えるために、端部にスタック要素とスイッチング素子の上部その後、スタックを調整する継続する必要があります。
- ステップ4は:そう繰り返し、再構築し、交換を交換しました。
4、Javaのヒープソートアルゴリズムを達成するために
1 パッケージcom.baozi.paixu; 2 3。 インポートjava.util.Arrays; 4。 5。 / ** 6。 *ヒープソート基本的な考え方:照合シーケンスが大きいヒープルートに設定する、この時の最大値は、シーケンス全体のスタックの最上位でありますルートノード。交換の端部は、これと素子 7 サイクルが得られるように、この場合、*エンドエレメントが最大で、その後、素子のn-1は、再犬ヒープを引き起こし、それは、n-1個の最大要素を受信する 8 *順序付けられたシーケンス。 9 *注:最良、最悪、O(nlogn)ヒープソートアルゴリズムの平均時間複雑である 10 のアルゴリズムのソート*ステップ: 11 * 1、スタックの初期設定:乱れ所定の構成の配列大ヒープルート(小根を有するスタックを降順昇順大型船とルートパイル)に 12れる *①常に下、右から左に方向付け第一の配列(アレイ装置)最後の非リーフノード(長さ/ 2-1)から決定調整 13は、 各サブツリーは、のルートノードの最大部分木であることを確認②* 14 、* 2スタック要素とスイッチング素子の上面の端部を、そのような要素の最大端こと、および残りのn-1個の要素N-1を調整し続ける継続する要素の数であり、 15 *ビッグヒープルートサイクルは、順序付けられたシーケンスを取得することができるように、この時のスタック要素のトップは、取り出されます。 16 * 17 * @author 包子 18である * @Create 2019-05-15-18:16 。19 * / 20れる パブリック クラス{ヒープソート 21は パブリック 静的 ボイドメイン(文字列[]引数){ 22である INT [] = NUMS 新しい新規 のint [] 10 {9 ,. 8 ,. 7 ,. 6 ,. 5 ,. 4 ,. 3,2 ,. 1。}; 23である ; HeapSort.heapSort(NUMS) 24 のSystem.out.println(Arrays.toStringの(NUMS)); 25 26はである } 27 28 公共の 静的な 無効ヒープソート(INT [] NUMS){ 29 // 大ルートヒープ・スタックを作成するために必要とされる。図1に示すように、ランダム要素の両方を大ルートスタックを作成する 30 // データ要素の始まりが配列中に存在するので、 31 // ここでの目的は、個別に調整しなければならない各非リーフノードのサイクルを使用することで 32 のための(INT。I = nums.length / 2 - 1; I> = 0; i-- ){ 33れる // ときに大きなヒープルート調整します(二分木構造のために)最後の非配向リーフノードのためのものである 34 @ 再編(ストレージアレイの目的のために)右から左へ 35 (NUMS、I、nums.length)adjustHeap; 36 } 37 // 2を、次にスイッチング素子と第1要素の端部と再調整スタック構造 38である ため(INT J = nums.length - 1; J> 0; J、){ 39 // 端にスタック要素とスイッチング素子の上部 40 スワップ(NUMS、0 、J); 41である // ヒープの再調整 42は adjustHeap(NUMS、0 、J); 43れる } 44である } 45 46であり、 プライベート 静的 無効スワップ(INT [] NUMSは、int型 I、int型のJ){ 47 のint TEMP = NUMS [I]; 48 NUMS [I]は= ; NUMS [J] 49 NUMS [J] = ; TEMP 50 } 51である 52れる プライベート 静的 ボイド adjustHeap(INT [] NUMSは、int型 I、int型の長さ){ 53である //は最初のiの電流要素取り除く 54は int型の TEMP = NUMS [I]; 55 // iは、子ノードの左ノードから開始し、即ち2I + 1開始時に、実際には、このサイクルは、最終的な位置を決定するためにノードを指示するために調整されている 56がある ため(INT * = 2 KをI + 1; K <長さ; K = K * 2 + 1 ){ 57は、 // 左の子場合右の子ノードよりも少ない点、kが右の子ノードを指す 58 IF(K + 1 <長&& NUMS [K] <NUMS [K + 1。]){ 59 K ++ ; 60 } 61である // 子ノードが親ノードよりも大きい場合、子ノード(交換なし)の親ノードに割り当てられた値 62 IF(NUMS [K]> {TEMP) 63が = NUMS [I] ; NUMS [K]を 64 I = ; K 65 } 66 } 67 // tempが最終位置への値である 68 NUMS [I] = 温度; 69 } 70 71です }