[コードコメントの詳細] Javaはマージソートアルゴリズムを実装しています

1。概要

      マージソートは、分割統治の典型的なアプリケーションを使用する安定したアルゴリズムです。既存の自己シーケンスを組み合わせて、完全に順序付けられたシーケンスを取得します。つまり、最初に各サブシーケンスの順序を作成し、次にサブシーケンスの順序を作成します。次に、2つの順序付きリストが1つの順序付きリストに結合されます。これは、双方向マージと呼ばれます。

     マージアルゴリズムとも呼ばれるマージ操作は、2つの連続したシーケンスを1つの連続したシーケンスにマージする方法を指します。

     数列がある場合{6,202,100,301,38,8,1}

    初期状態:6,202,100,301,38,8,1

    最初のマージ後:{6,202}、{100,301}、{8,38}、{1}

    2回目のマージ後:{6,100,202,301}、{1,8,38}

    3回目のマージ後:{1,6,8,38,100,202,301}

2.マージおよびソートアルゴリズムのアイデアの分析

     ①元の配列と同じスペースでソートされた配列を申請する

     ②2つのポインタを定義します。最初の認識位置は2つのソートされた開始位置です。

     ③2つのポインタが指す要素を比較し、小さい方を選択して新しい配列空間に配置し、ポインタを下に移動します

    残りの配列が新しい配列の最後に追加されるまで、手順③を繰り返します。

    たとえば、初期配列:[24,13,26,1,2,27,38,15]

    ①同じサイズの2つのサブアレイに分割:[24,13,26,1] [2,27,38,15]

    ②同じサイズの4つのサブアレイに分割されます:[24,13] [26,1] [2,27] [38,15]

    ③このとき、左<右はまだ確立されており、[24] [13] [26] [1] [2] [27] [38] [15]に分けられます。

    この時点で、8つの小さな配列があり、各配列は順序付けられた配列と見なすことができます。、左==各配列で右、再帰から戻る

        //配列要素を分離します
        mergeSort(arr、left、mid);
        mergeSort(arr、mid + 1、right);
        //配列要素を比較、ソート、
        マージしますmerge(arr、left、mid、right);

       次に->

       merge([24]、[13])は[13,24]を取得します

       merge([26]、[1])は[1,26]を取得します

3.コードの実装

public class MergeDemo {
	
	public static void main(String[] args) {
		int[] array = {7,3,1,4,8,10};
		mergeSort(array, 0, 5);
		merge(array, 0, 2, 5);
		System.out.println(Arrays.toString(array));
	}
	
	// 一 对整个数组进行排序
	// 先对整个序列进行分组
	// 参数 需要排序的数组  数组的第一个位置  数组的最后一个位置 将排序的数组放在新的数组里面
	private static void mergeSort(int[] arr,int left,int right) {
		// 判断数组
		if(left >= right) {
			return;
		}
		// 分治左边和右边  取中间坐标
		int mid = (left + right)/2;
		// 将数组元素分开
		mergeSort(arr,left,mid);
		mergeSort(arr,mid+1,right);
		// 将数组元素比较 排序合并
		merge(arr,left,mid,right);
	}
	
	// 合并
	private static void merge(int[] arr,int left,int mid,int right) {
		// 定义第一个归并序列开始的地方
		int s1 = left;
		
		// 定义第二个归并序列开始的地方
		int s2 = mid + 1;
		
		// 定义已经归并好的序列元素存放的位子
		int[] temp = new int[arr.length];
		//定义临时序列的下标 从0开始
		int i = 0;
		// 向临时序列赋值
		while(s1 <= mid && s2 <= right) {
			if(arr[s1] <= arr[s2]) {
				temp[i++] = arr[s1++];
			}else {
				temp[i++] = arr[s2++];
			}
		}
		
		// 如果其中一个序列比较完了 剩下的那组序列就放进去
		while(s1 <= mid) {
			temp[i++] = arr[s1++];
		}
		while(s2 <= right) {
			temp[i++] = arr[s2++];
		}
		// 将temp中的元素 复制到 arr序列中
		i = 0;
		while(left <= right) {
			arr[left++] = temp[i++];
		}
	}
}

4.アルゴリズムの複雑さの分析

    マージソートの時間計算量はO(nlogn)です。具体的な計算については、https://blog.csdn.net/a1033025319/article/details/88650514にアクセスしてください。

   マージソートは、すべてのソートの中で最小の比較数であり、最初は連続的に分割され、比較はマージされた順序付きサブ配列でのみ発生します。

5.まとめ

   マージソートの再帰的な方法を理解するのがより難しいのは、ソートマージです。最初は混乱していましたが、配列の個別の部分を並べ替えるにはどうすればよいですか?次のコード行を呼び出します:merge(arr、left、mid、right)。要素をマージするときに要素を並べ替えます。

   はい、今日はこれでおしまいです。よろしければ、親指を立ててください。

 

 

おすすめ

転載: blog.csdn.net/Sunshineoe/article/details/114747590