マージソート
原理
マージソート(マージソート)のコアアイデアは、配列をソートする場合、最初に配列を中央から2つの部分に分割し、次に2つの部分を別々にソートしてから、ソートされた2つの部分をマージすることです、配列全体がすべて順序付けられるようにします。マージソートは分割統治法を使用します。
分割統治
分割統治法は、その名前が示すように、分割統治法であり、大きな問題をより小さなサブ問題に解決します。小さなサブ問題が解決されると、大きな問題が解決されます。分割統治法のアイデアは、通常、再帰によって実装されます。分割統治は問題を解決するための処理のアイデアであり、再帰はプログラミング手法であり、2つは競合しません。再帰の場合、再帰式と終了条件を見つける必要があるため、再帰式を記述します。mergeSort(m-> n)= merge(mergeSort(m-> k)、mergeSort(k + 1-> n));終了m = nの場合。つまり、m-> nの間でシーケンスを並べ替える場合、実際にはm-> kの間でシーケンスを並べ替え、k + 1-> nの間でシーケンスを並べ替えてから、順序付けられたシリーズは最終シリーズと呼ばれます。同様に、各シリーズの並べ替えは、再帰を形成するために分割され続けることができます。
アルゴリズムのプロセスは次のとおりです
アルゴリズムの説明:
- 長さnの入力シーケンスを長さn / 2の2つのサブシーケンスに分割します。
- これらの2つのサブシーケンスにはそれぞれマージソートを使用してください。
- 最後に、2つのソートされたサブシーケンスが、最終的なソートされたシーケンスにマージされます。
コード
public class MergeSort {
//1.如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序
//2.再将排好序的两部分合并在一起,这样整个数组就都有序了
public static void main(String[] args) {
int[] array = {
5, 2, 6, 9, 0, 3, 11, 7};
MergeSort sort = new MergeSort();
int[] ints = sort.mergeSort(array);
System.out.println(Arrays.toString(ints));
}
public int[] mergeSort(int[] arr) {
if (arr.length < 2) {
return arr;
}
//将数组从中间拆分成左右两部分
int mid = arr.length / 2;
int[] left = Arrays.copyOfRange(arr, 0, mid);
int[] right = Arrays.copyOfRange(arr, mid, arr.length);
return merge(mergeSort(left), mergeSort(right));
}
//合并两个有序数组并返回新的数组
public int[] merge(int[] left, int[] right) {
//创建一个新的数组,等于left+right之和
int[] newArray = new int[left.length + right.length];
//定义两个指针,分别代表两个数组的下标
int lindex = 0;
int rindex = 0;
for (int i = 0; i < newArray.length; i++) {
if(lindex >= left.length){
newArray[i] = right[rindex++];
}else if(rindex >= right.length){
newArray[i] = left[lindex++];
}else if(left[lindex] < right[rindex] ){
newArray[i] = left[lindex++];
}else{
newArray[i] = right[rindex++];
}
}
return newArray;
}
}
1:マージソートの時間計算量はどれくらいですか?
マージソートの実行効率は、ソートされる元の配列の順序とは関係がないため、時間計算量は、最良の場合、最悪の場合、または平均的な場合に関係なく、非常に安定しています。時間計算量はO(nlogn)です。 。
2:マージソートのスペースの複雑さは何ですか?
マージソートのスペースの複雑さはO(n)です。
3:マージソートは安定したソートアルゴリズムですか?
マージソートアルゴリズムの安定性は、マージ関数merge()に依存しません。つまり、2つの順序付きサブ配列が順序付き配列にマージされるコードの部分です。マージ関数を分析すると、マージソートも安定したソートアルゴリズムであることがわかります。