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

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

[[393503]]

基本的な紹介

マージソートは、マージの考え方を使用するソート方法です。このアルゴリズムは、古典的な分割統治戦略を採用しています(分割統治法では、問題をいくつかの小さな問題に分割してから再帰的に解決し、統治段階では分割された段階で得られた答えを「パッチ」でまとめます。つまり、分割統治です)。

概略図

注: この構造は完全な二分木に非常に似ていることがわかります。この記事では、再帰を使用してマージ ソートを実装します (反復的な方法で実装することもできます)。ステージは、サブシーケンスを再帰的に分割するプロセスとして理解できます。

処理段階を見てみましょう。2 つの順序付けられたサブシーケンスを 1 つの順序付けられたシーケンスにマージする必要があります。たとえば、下の図の最後のマージでは、2 つの順序付けられたサブシーケンス [4,5,7,8] と [1,2,3,6] を最終シーケンス [1,2,3,4,5,6,7,8] にマージする必要があります。実装手順を見てみましょう。

コードサンプル

  1. パッケージ com.structures.sort;
  2.  
  3. blic クラス MergeSort {
  4. 公共 静的void main(String[] args) {
  5. int [] arr = 新しいint [80000];
  6. ( int i = 0; i < 80000; i++) {
  7. arr[i] = ( int ) (Math.random() * 8000000);
  8. }
  9. int [] temp = 新しいint [arr.length];
  10. 長い開始 = System.currentTimeMillis();
  11.  
  12. マージソート(arr,0,arr.length-1, temp );
  13. 長い終了= System.currentTimeMillis();
  14. System.out.println ( "所要時間:" +((終了- 開始))+ "ミリ秒" );
  15. /*
  16. 所要時間: 15ms
  17. */
  18. }
  19.  
  20. //分離+組み合わせ
  21. 公共 静的void mergeSort( int [] arr, int   int   int [] temp ){
  22. <)の場合{
  23. int中央 = (+) / 2;
  24. //左に再帰的に分解する
  25. mergeSort(arr、 left 、mid、 temp );
  26. //右方向に再帰的に分解する
  27. mergeSort(arr, mid + 1, right , temp );
  28. //マージ
  29. マージ(arr、、中央、一時);
  30. }
  31. }
  32.  
  33. /**
  34. * マージ
  35. * @param arr ソートされた元の配列
  36. * @param left左順序シーケンスの初期インデックス
  37. * @param mid 中間インデックス
  38. * @param right右インデックス
  39. * @param tempは転送配列です
  40. */
  41. 公共 静的voidマージ( int []arr, int   int中央、 int   int [] temp ){
  42. int i = left ; // 左の順序付きシーケンスの初期インデックス i を初期化します
  43. int j = mid + 1; // 右側の順序付きシーケンスの初期インデックス j を初期化します
  44. int t = 0; //一時配列の現在のインデックスを指します
  45.  
  46. //(1つ)
  47. //まず、ルールに従って、左側と右側の(順序付けられた)データを一時配列に入力します
  48. //左側と右側の順序付けられたシーケンスの1つが処理されるまで、つまりすべてが一時配列に入力されるまで
  49. (i <= 中央 && j <=) の間 {
  50. // 左側の順序付けられたシーケンスが右側の順序付けられたシーケンスの現在の要素より小さいか等しい場合
  51. // 左側の現在の要素を一時配列にコピーします
  52. //次にt++、i++を後方に移動する
  53. もし(arr[i] <= arr[j]){
  54. temp [t] = arr[i];
  55. t += 1;
  56. 私 += 1;
  57. } else // 逆に、右側の順序付きシーケンスの現在の要素を一時配列に入力します
  58. temp [t] = arr[j];
  59. t += 1;
  60. 1 を越える
  61. }
  62. }
  63.  
  64. //(二)
  65. // 残りのデータをtempに順番に埋め込む 
  66. while (i <= mid){//左側にまだ残っているので、それを一時配列に入力します。
  67. temp [t] = arr[i];
  68. t += 1;
  69. 私 += 1;
  70. }
  71. (j <=) の間 {
  72. temp [t] = arr[j];
  73. t += 1;
  74. 1 を越える
  75. }
  76.  
  77. //(三つ)
  78. // temp配列の要素をarrにコピーします
  79. //毎回すべてがコピーされるわけではないことに注意してください
  80. // 最初のマージ leftTemp = 0、 right = 1、2 番目のマージ leftTemp = 2、 right = 3、3 番目のマージ leftTemp = 0、 right = 3...
  81. t = 0;
  82. int leftTemp =;
  83. (左温度<=){
  84. arr[左温度] =温度[t];
  85. 左温度 += 1;
  86. t += 1;
  87. }
  88. }

【編集者のおすすめ】

  1. Ubuntu Linux に Windows 10 をインストールする最も簡単な方法
  2. システムのハードウェア情報を表示するためによく使用される Linux コマンド 9 つ (例と詳細な説明付き)
  3. この記事では、なぜこれほど多くの人が暗号通貨に投機しているのかを説明します。
  4. 10万スターを獲得したGitHubオープンソースプロジェクト10選
  5. Excel さえも凌駕します! WPS のこれらの機能をご存知ですか?

<<:  AI、機械学習、ディープラーニングの解放

>>:  AIを使って古い写真をカラー化するのは本当に正確なのでしょうか?技術界と歴史界は1,000のポストを主張した

ブログ    
ブログ    
ブログ    

推薦する

ボストン住宅データセットに基づくシンプルなMLP回帰モデルのトレーニング

[[422501]]多層パーセプトロン(MLP)は非常に長い歴史を持っています。多層パーセプトロン(...

世界初、AIによる豚のクローン作成に成功!南開大学がやった

超AI制御により、機械が自動的に人間の胚のクローンを作成し、培養用の栄養プールに送り込み、人間のバッ...

現時点で最も包括的なPythonの採用方針

Pythonは、コンパイル速度が超高速なオブジェクト指向プログラミング言語です。誕生から25年が経ち...

「AIネイティブ」の潜在能力を解き放ち、新たな「サイバー空間」を切り拓くには?

2023年にAIが世界にどのような変化をもたらすかといえば、間違いなくビッグモデルの急速な発展が最...

...

1年間で18本の論文:Google Quantum AI チームの2021年年次概要

量子コンピューティングは、常に次の産業革命の原動力と考えられてきました。さまざまな国やテクノロジー企...

AIスタートアップで2年間働いて学んだ7つのこと

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

...

動作計画のための探索アルゴリズム: フロントエンド計画、バックエンド軌道生成から状態解まで

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

...

1.4GB 未満のビデオ メモリで 10,000 フレームのビデオをセグメント化します。コードは現在オープン ソースです。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

...

アリババに採用された中国の高レベル科学者がAIがもたらす想像力の空間について語る

彼はかつてアマゾンの中国トップレベルの科学者であり、1年前に世界の小売業界にセンセーションを巻き起こ...

プログラマのための基本アルゴリズム: 再帰の説明

[[346111]]序文再帰は非常に重要なアルゴリズムの考え方です。フロントエンド開発者であっても、...