マージソートとその時間計算量分析

マージソートとその時間計算量分析

マージソートとは?

マージソートは分割統治の考え方を体現しており、元の配列を分割し、各部分を別々にソートしてから、それらを 1 つずつマージし、最終的に目的の結果を達成します。

  1. 配列を分割する

ここに画像の説明を挿入

  • 配列をソートする

ここに画像の説明を挿入

  • 並べ方(小から大)

ここに画像の説明を挿入

コード部分

/**
 * @author `dongxu.kwb`
 * @date `2022/8/30`
 */
public class MergeSort {
    
    
    public static void main(String[] args) {
    
    
        int[] arr = {
    
    79,3213,3,5,45,65};
        mergeSort(arr);
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.println(arr[i]);
        }
    }
    public static void mergeSort(int[] arr) {
    
    

        //判断下数组是否为空,或者是一个数

        if (arr == null || arr.length < 2) {
    
    
            return;
        }

        //给整个数组分割并且排序

        process(arr, 0, arr.length - 1);
    }

    /**
     * 主要负责递归
     * @param arr
     * @param left
     * @param right
     */

    public static void process(int[] arr, int left, int right) {
    
    

        //递归结束条件

        if (left == right) {
    
    
            return;
        }

        //找中点

        int mid = left + ((right - left) >> 1);

        //左右拆分并且排序

        process(arr, left, mid);
        process(arr, mid + 1, right);

        //排序

        merge(arr, left, mid, right);
    }

    /**
     * 主要负责排序
     * @param arr
     * @param left
     * @param mid
     * @param right
     */

    public static void merge(int[] arr, int left, int mid, int right) {
    
    
        int[] help = new int[right - left + 1];
        int i = 0;
        int p1 = left; //左指针
        int p2 = mid + 1; //右指针

        //如果左右指针都没超出边界

        while (p1 <= mid && p2 <= right) {
    
    
            help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
        }

        //左指针超出边界

        while (p1 <= mid) {
    
    
            help[i++] = arr[p1++];
        }

        //右指针超出边界

        while (p2 <= right){
    
    
            help[i++] = arr[p2++];
        }

        //将排好序的部分同步到arr原数组中

        for (int i1 = 0; i1 < help.length; i1++) {
    
    
            arr[left + i1] = help[i1];
        }
    }
}

時間の複雑さの分析

再帰関数では、部分再帰が同じ可能性を持つことがわかりました。したがって、マスター式を使用できます。

マスター表現の記事を参照してください: https://blog.csdn.net/abaidaye/article/details/126603143

        process(arr, left, mid);
        process(arr, mid + 1, right);

マージ関数では、何があっても、2 つのポインターの合計が n 個の数値をトラバースするため、d=O(n) となります。

したがって、この質問の基本公式は、T(n) = 2 * T(n/2) + O(n) です。

このときlogba log^a_bログ_ _ba== d なので、時間計算量は O(n log 2 n log_2^nログ_ _2n)

おすすめ

転載: blog.csdn.net/abaidaye/article/details/126623860