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のポストを主張した

推薦する

TensorFlow 2.8.0が正式にリリースされ、多くのバグが修正され、50以上の脆弱性パッチがリリースされました

最近、TensorFlow は公式バージョン 2.8.0 をリリースしました。バージョン 2.7 の...

2019-2020年中国人工知能コンピューティングパワー開発評価報告書が発表

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

...

Scikit-learn を使用して機械学習用のテキストデータを準備する方法

[[208625]]テキスト データを使用して予測モデルを構築する前に、特別な準備が必要です。まずテ...

より良い機械学習にはより良いデータ注釈が必要

Apple の誰かがラベル付きデータを収集するために数億ドルを費やしましたが、まだ良い結果は得られて...

...

...

現在、CIOは企業におけるGenAIの応用価値を慎重に検討している。

ほとんどの CIO は、自社のビジネスがテクノロジーのトレンドに追いつくために GenAI の検討を...

...

AIOps によるネットワーク管理の一般的な方法

エンタープライズ NetOps チームは、大量の受信データを精査して、ネットワーク上で発生する技術、...

...

...

人工知能はデジタルマーケティング革命において否定できないトレンドとなっている

人工知能 (AI) は、現在、デジタル マーケティング革命における否定できないトレンドとなっています...

高品質な人工知能メンタルヘルスカウンセリングアプリを開発するには?

生活の質は向上している一方で、人々の精神状態は悪化しています。 [[317751]]群衆の中にうつ病...