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)。要素をマージするときに要素を並べ替えます。
はい、今日はこれでおしまいです。よろしければ、親指を立ててください。