Java ソートアルゴリズムの概要 (VI): ヒープソート

Java ソートアルゴリズムの概要 (VI): ヒープソート

ヒープソートとは、ヒープツリー (ヒープ) のデータ構造を使用して設計されたソート アルゴリズムのことで、配列の特性を利用して、指定されたインデックスの要素をすばやく見つけることができます。ヒープソートは、補助空間が O(1)、最悪時間計算量が O(nlog2n) の不安定なソート方法です。ヒープソートの平均パフォーマンスは、最悪のパフォーマンスに近くなります。

ヒープソートでは、大きなルートヒープ(または小さなルートヒープ)の最上位レコードのキーワードが ***(または最小)キーワードであるという特徴を利用し、現在の順序付けされていない領域で ***(または最小)キーワードを持つレコードを簡単に選択できるようにします。

(1)大ルートヒープソートを使用する基本的な考え方

①まず、初期ファイルR[1..n]を大きなルートヒープに構築します。これは、初期の順序付けされていない領域です。

②次に、レコードR[1](つまりヒープの先頭)を順序なし領域の最後のレコードR[n]と交換し、新しい順序なし領域R[1..n-1]と順序付き領域R[n]を取得し、R[1..n-1].keys≤R[n].keyを満たす。

③交換後の新しいルートR[1]はヒープ特性に違反する可能性があるため、現在の順序付けられていない領域R[1..n-1]をヒープに調整する必要があります。次に、R[​​1..n-1]の最後のキーを持つレコードR[1]を、間隔内の最後のレコードR[n-1]と交換します。これにより、新しい順序なし領域R[1..n-2]と順序付き領域R[n-1..n]が得られ、関係R[1..n-2].keys≤R[n-1..n].keysが満たされます。同様に、R[1..n-2]をヒープに調整する必要があります。

順序付けされていない領域に要素が 1 つだけになるまで。

(2)ビッグルートヒープソートアルゴリズムの基本操作:

① 初期化操作:初期ヒープとしてR[1..n]を構築する。

②各ソートラウンドの基本操作:現在の順序なし領域の最上位レコードR[1]をその領域の最後のレコードと交換し、新しい順序なし領域をヒープ(再構築ヒープとも呼ばれる)に調整します。

知らせ:

① ソート操作はn-1回のみで、より大きなn-1個のキーワードを選択することでファイルを昇順にソートすることができます。

② 小さいルートヒープを使用したソートは、ソート結果が降順になることを除いて、大きいルートヒープを使用した場合と似ています。ヒープ ソートは、直接選択ソートの逆です。ヒープ ソートでは、いつでも、順序付けされていない領域が順序付けされた領域の前にあり、順序付けされた領域は、元のベクトルの末尾から先頭に向かって、ベクトル全体まで徐々に拡張されます。

コード実装:

  1. 公共 クラステスト{
  2. 公共 静的  int [] Heap = { 10 , 32 , 1 , 9 , 5 , 7 , 12 , 0 , 4 , 3 }; // プリセットデータ配列 
  3. 公共 静的  void main(文字列args[]) {
  4. int i; // ループカウント変数 
  5. int Index = Heap.length; // データインデックス変数 
  6. System.out.print( "ソート前: " );
  7. (i = 1 ; i < インデックス - 1 ; i++)の場合
  8. System.out.printf( "%3s" , ヒープ);
  9. System.out.println( "" );
  10. HeapSort(Index - 2 ); // ヒープソート 
  11. System.out.print( "ソート後: " );
  12. (i = 1 ; i < インデックス - 1 ; i++)の場合
  13. System.out.printf( "%3s" , ヒープ);
  14. System.out.println( "" );
  15. }
  16. /**
  17. * ヒープを構築する
  18. */    
  19. 公共 静的  void CreateHeap( intルート、 intインデックス) {
  20. int i, j; // ループカウント変数 
  21. int Temp; // 一時変数 
  22. int Finish; // ヒープが構築されているかどうかを判定する 
  23. j = 2 * Root; // 子ノードのインデックス 
  24. Temp = Heap[Root]; // Heapのルート値を一時的に保存する 
  25. Finish = 0 ; // デフォルトのヒープ作成はまだ完了していません 
  26. while (j <= インデックス && 終了 == 0 ) {
  27. if (j < Index) // ***の子ノードを見つける 
  28. (ヒープ[j] < ヒープ[j + 1 ])の場合
  29. j++;
  30. (Temp >= Heap[j])の場合
  31. Finish = 1 ; // ヒープの作成が完了しました 
  32. それ以外{
  33. Heap[j / 2 ] = Heap[j]; // 親ノード = 現​​在のノード 
  34. 2 * j = 2;
  35. }
  36. }
  37. Heap[j / 2 ] = Temp; // 親ノード = ルート値 
  38. }
  39. 公共 静的  voidヒープソート( intインデックス) {
  40. 整数i, j, 温度;
  41. // バイナリツリーをヒープに変換する 
  42. (i = (インデックス / 2 ); i >= 1 ; i--)の場合
  43. ヒープを作成します(i, インデックス);
  44. // ヒープソートを開始 
  45. (i = インデックス - 1 ; i >= 1 ; i--) {
  46. Temp = Heap; // Heapのルート値を最後の値と交換する 
  47. ヒープ = ヒープ[ 1 ];
  48. ヒープ[ 1 ] = 一時;
  49. CreateHeap( 1 , i); // 残りの値のヒープを再構築します 
  50. System.out.print( "ソート: " );
  51. (j = 1 ; j <= インデックス; j++)の場合
  52. System.out.printf( "%3s" ,ヒープ[j]);
  53. System.out.println( "" );
  54. }
  55. }
  56. }

ヒープはツリーとして表示され、ヒープ内のノードの高さは、ノードからリーフ ノードへの最長の単純な降順パス上のエッジの数として定義できます。ヒープの高さは、ツリーのルートの高さとして定義されます。ヒープ構造に対するいくつかの基本的な操作は、ツリーの高さに比例する時間、O(lgn) で実行されることがわかります。この記事がお役に立てれば幸いです。

【編集者のおすすめ】

  1. Java配列についての詳細な考察
  2. Javaアーキテクチャの設計と開発に関するヒント
  3. メモリを効率的に節約するJavaプログラミング解析方法
  4. Javascriptはブラウザの互換性の問題を解決します

<<:  Java ソートアルゴリズムの概要 (VII): クイックソート

>>:  Java ソートアルゴリズムの概要 (V): マージソート

ブログ    
ブログ    

推薦する

エッセンス共有サイトのランキングアルゴリズムのまとめ

ウェブサイトのランキングは、ウェブサイトの最適化を行うすべての人が最も気にしていることです。しかし、...

...

7つの予測ストレージ分析ツールの比較

人工知能技術は、機械学習、計算統計、さまざまなディープラーニングモデルの使用を通じて主流になりました...

北京冬季オリンピックと人工知能が出会うと、どんな火花が散るのでしょうか?

2008年、北京オリンピックのテクノロジーと壮大な雰囲気は世界に深い印象を残しました。 2022年...

北京航空航天大学はモードの壁を打ち破り、可視光と赤外線モードにわたる普遍的な物理的対抗手段を開発しました。

近年、視覚システムのセキュリティ評価の研究が徐々に深まっています。研究者は、メガネ、ステッカー、衣服...

機械が人間に取って代わるというのは空想ではありません。最初に影響を受けるのは 3 つの職業です。油断しないでください。

科学技術の継続的な発展により、多くの業界で「ロボット」が使用され、効率が向上するだけでなく、人件費も...

小井ロボットの華蔵エコシステムの出現は、大型モデルの商業化の始まりを示しています

10月26日、「人工知能分野での中国初の上場企業」であるXiaoi RobotがHuazang Un...

張亜琴:業界にとって、ディープラーニングの黄金時代は始まったばかりだ

本日、張亜琴教授はCNCC 2020で「スマートテクノロジーのトレンド」をテーマに講演しました。デジ...

さようなら、宅配便業者さん!

この時代の変化のスピードは想像を絶します!次から次へと生み出される想像力豊かな革新は、目を見張るほど...

次回の組み込み設計に人工知能を使用する4つの理由

次のプロジェクトに機械学習を取り入れるべき 4 つの理由をご紹介します。 理由その1 – マーケティ...

トイレに座ってアルゴリズムを見る: クイックソート

高速かつ経済的なソートアルゴリズムスペースを無駄にせず、より高速なソートアルゴリズムはありますか?そ...

ロボットはサービス業界に参入できるのか?事実が教えてくれる

有名なアニメーション会社ディズニーは、近々人工知能とロボット工学の分野に参入すると発表しました。ディ...

Apple Watchも新型コロナウイルスを検知可能:症状が出る7日前に検知可能

現在、新型コロナウイルスの核酸検査のほとんどは、咽頭ぬぐい液を使って行われている。スマートウォッチを...

IoT セキュリティ: RSA 暗号化および復号化アルゴリズム

[[357279]] WeChat パブリックアカウント: コンピューターとネットワークのセキュリテ...