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 つになりますが、何が欠けているのでしょうか?

ブログ    
ブログ    
ブログ    

推薦する

...

企業の75%が現在ChatGPTを無効化しているか、永久に無効化する予定である。

BlackBerry が発表した新しい調査によると、世界中の組織の 75% が現在、職場での Ch...

警察が採用したボストン・ダイナミクスの犬たちは、感情のない「監視ツール」になるのだろうか?

[[384524]]ニューヨークのマンハッタン北部のアパートで男性2人が人質に取られている。その数...

今後 20 年以内に、完全自動運転のコネクテッドカーが登場するでしょうか?

20 年後の旅行と交通の未来はどうなるでしょうか? おそらく、この質問への答えははるかに複雑です。...

...

速報です!画像AI企業「Huiyi Huiying」がハッキングされ、COVID-19研究成果が公開された

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

...

北京が初の政策実験区を設置:自動運転は今年中に試験運用へ

車に乗り込み、コードをスキャンすると、運転手が操作しなくても黒い「タクシー」が動き出す。横断歩道では...

AIは物理的なセキュリティ運用に高度な分析を活用しています

人工知能が徐々に物理セキュリティの分野に参入するにつれて、より高度なアクセス制御ソリューションが登場...

2021年の人工知能の注目分野

[[383142]]人工知能、またはよく耳にする AI とは、人間が作った機械が示す知能を指し、コン...

Facebook エンジニアがまとめた 14 種類のアルゴリズム面接モード

プログラマー職の面接では、多くの場合、プログラミング面接プロセスを受ける必要があり、雇用主はこれを利...

人工知能企業が利益を上げるのは難しいと言われていますが、具体的に何が難しいのでしょうか?

[[272155]] 2016年にAlphaGoが「人間対機械」の競争に勝利して以来、人工知能への...

ポピュラーサイエンス記事: GPT の背後にあるトランスフォーマー モデル

前回の記事「AIビッグモデルの解釈、トークンの理解から始める」では、最も基本的な概念である「トークン...