Java プログラミング スキル - データ構造とアルゴリズム「ヒープ ソート」

Java プログラミング スキル - データ構造とアルゴリズム「ヒープ ソート」

[[389058]]

ヒープソートの基本

  1. ヒープソートは、ヒープデータ構造を使用して設計されたソートアルゴリズムです。ヒープソートは選択ソートです。最良、最悪、平均の時間計算量はすべて O(nlogn) であり、不安定なソートです。
  2. ヒープは、次の特性を持つ完全な二分木です。各ノードの値は、その左と右の子ノードの値以上であり、最大ヒープと呼ばれます。注: 最大子ノード値のサイズ関係は要件ではありません。
  3. 各ノードの値は、左と右の子ノードの値以下であり、これをミニヒープと呼びます。
  4. 最大ヒープ特性: arr[i ] >= arr[2i+1] && arr[i] >= arr[2i+2]、iはノード番号に対応し、iは0から始まります。
  5. ミニヒープの特性: arr[i ] <= arr[2i+1] && arr[i] <= arr[2i+2]、iはノード番号に対応し、iは0から始まります。
  6. 一般的に、昇順の場合は大きなトップヒープが使用され、降順の場合は小さなトップヒープが使用されます。

ヒープソートの基本的な考え方

  1. ソートするシーケンスを大きなトップヒープに構築する
  2. この時点で、シーケンス全体の最大値はヒープの最上部にあるルート ノードになります。
  3. 配列の最後の要素と交換すると、最後が最大値になります。
  4. 次に、残りの n-1 個の要素をヒープ内に再構築し、n 個の要素の次に小さい値を取得します。このプロセスを繰り返して繰り返すことで、順序付けられたシーケンスを取得できます。

最大ヒープ構築の過程で、要素数が徐々に減少し、最終的に順序付けられたシーケンスが得られることがわかります。

配列内の非リーフノードの数 = arr.length / 2 - 1

コード例

  1. パッケージ com.xie.tree;
  2.  
  3. パブリッククラスHeapSort {
  4. 公共 静的void main(String[] args) {
  5. int [] arr = 新しいint [8000000];
  6. ( int i = 0; i < 8000000; i++) {
  7. arr[i] = ( int ) (Math.random() * 800000000);
  8. }
  9. 長い開始 = System.currentTimeMillis();
  10. ヒープソート(arr);
  11. 長い終了= System.currentTimeMillis();
  12. System.out.println ( "所要時間:" +( end -start)+ "ms" );
  13. /**
  14. * 800万件のデータ
  15. * ヒープソート!!
  16. * 消費時間: 2482ms
  17. */
  18. }
  19.  
  20. 公共 静的voidヒープソート( int []arr){
  21. 整数 温度= 0;
  22. System.out.println ( "ヒープソート!!" ) ;
  23.  
  24. //1. 順序付けられていないシーケンスからヒープを作成し、昇順と降順の要件に従って、大きいトップ ヒープまたは小さいトップ ヒープを選択します。
  25. ( int i = arr.length / 2 - 1; i >= 0; i --) {  
  26. ヒープを調整します(arr、i、arr.length);
  27. }
  28. //2. ヒープの先頭要素を配列の末尾要素と交換し、最大の要素を配列の末尾に「シンク」します。
  29. //3. ヒープ定義を満たすように構造を再調整し、ヒープの最上位要素と現在の終了要素を交換し続け、シーケンス全体が整うまで調整 + 交換手順を繰り返し実行します。
  30. ( int j = arr.length - 1; j > 0; j --) {  
  31. //交換
  32. temp = arr[j];
  33. arr[j] = arr[0];
  34. arr[0] =一時;
  35. ヒープを調整します(arr, 0, j);
  36. }
  37. }
  38.  
  39. /**
  40. * 配列(バイナリツリー)を大きなトップヒープに調整する
  41. * 機能: iに対応する非リーフノードのツリーを最大ヒープに調整する
  42. *
  43. * @param arr 調整する配列
  44. * @param i は配列内の非リーフノードのインデックスを表します
  45. * @param lengthは調整される要素の数を示し、長さは徐々に減少します
  46. */
  47. 公共 静的void調整ヒープ( int [] arr、 int i、 int長さ) {
  48. //まず現在の要素の値を取り出して一時変数に保存します
  49. 整数  temp = arr[i];
  50. //k = 2 * i + 1 はノード i の左の子ノードです
  51. ( int k = 2 * i + 1; k < 長さ; k = k * 2 + 1) {
  52. //左の子ノードの値が右の子ノードの値より小さい場合
  53. (k + 1 < 長さ && arr[k] < arr[k + 1]) の場合 {
  54. k++; //kは右の子ノードを指す
  55. }
  56.  
  57. //子ノードの値が親ノードの値より大きい場合
  58. もしarr[k] > tempであれば
  59. // 大きい方の値を現在のノードに代入する
  60. arr[i] = arr[k];
  61. //!!! iはkを指し、ループして比較を続けます
  62. 私 = k;
  63. }それ以外{
  64. 壊す;
  65. }
  66. }
  67.  
  68. // forループが終了すると、i を親ノードとするツリーの最大値を一番上に配置します。
  69.  
  70. //調整された位置に温度値を配置します
  71. arr[i] =一時;
  72. }
  73. }

【編集者のおすすめ】

  1. 妹に Java 16 の新機能について話しましたが、とても素晴らしいそうです!
  2. IT プロジェクトが多すぎて管理が難しくなっていませんか?いいえ!あなたはまだこの7つのコツを学んでいないからです
  3. Pythonを5年間学んできましたが、これらのウェブサイトをもっと早く知らなかったことを後悔しています。ぜひ一緒に見に来てください。
  4. Java はすでに 16 まで達しているのに、なぜまだ 8 が使われているのでしょうか? どんどん悪化しているのでしょうか?
  5. すごいですね! Windows 10 のこれらのブラックテクノロジー機能を使用したことがありますか?

<<:  「水中ドローン」が登場?柔らかいロボット魚が世界最深の海溝を探索

>>:  6G はテクノロジーにおける最大の投資の 1 つになりますが、何が欠けているのでしょうか?

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

AIがハイパフォーマンスコンピューティングから学べる7つの教訓

効果的な IT 組織は、ハイパフォーマンス コンピューティング (HPC) から教訓を得て、システム...

...

人工知能は良いものだが、企業はAIの適用時に4つの大きな間違いを犯している。

問題は正確には何ですか? これらのエラーを回避する方法はありますか?今日、人工知能 (AI)、機械学...

ほんの数行の Python コードで、将来の子供がどのような外見になるかを予測できますか?強力な人工知能

今回はBaidu Smart Cloudの顔認識機能とPythonを組み合わせて実験してみました。結...

スペルミスを心配する必要はありません。Microsoft Edge ブラウザに新しいウェブ「スマート検索」AI 機能が追加されます。

8月23日、Microsoft Edgeブラウザは、ユーザーがウェブ上で関連コンテンツを簡単に検索...

未来の生活に革命をもたらす5つのテクノロジートレンド

テクノロジーは、絶え間ない進歩と常に変化する可能性により、私たちの日常生活に組み込まれるようになりま...

Spark機械学習APIの選び方

この記事では、主に統計アルゴリズム、分類アルゴリズム、クラスタリング アルゴリズム、協調フィルタリン...

...

大規模言語モデルとベクトルデータベースに基づくニュース推奨システムの開発

翻訳者|朱 仙中レビュー | Chonglou近年、 ChatGPTやBardなどの生成AIツールの...

...

...

...

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

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

人工知能技術は若者の雇用にどのような影響を与えるでしょうか?

人工知能の発展の過程で、常に次のような声が聞かれます。「人工知能によって、特に若者を中心に、失業者が...