ソートアルゴリズム---マージアルゴリズム(Javaバージョン)

マージソート

原理

マージソート(マージソート)のコアアイデアは、配列をソートする場合、最初に配列を中央から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つの順序付きサブ配列が順序付き配列にマージされるコードの部分です。マージ関数を分析すると、マージソートも安定したソートアルゴリズムであることがわかります。

おすすめ

転載: blog.csdn.net/qq_33626996/article/details/113177860