演算法學習---歸併演算法簡單記錄

chengtufeiyan發表於2020-10-29

歸併演算法思想記錄

1、核心思想

  • 將難以一次性解決的原始問題(大問題),分割為較為容易處理的小問題(此步驟一般遞迴、迭代均可實現),計算結果;
  • 然後將小問題的計算結果合併(匯聚or統計);
  • 最終得到問題答案。

2、應用

經典應用,陣列排序演算法(遞迴實現方式)如下:
在學習過程中,應該先理解演算法整個流程,在掌握整個流程之前,如果在某一點的實現上有問題,可以暫時放下,後續把它研究透徹。

  • mergeSort方法開啟陣列分割流程
  • recusion方法具體分割實現
  • merge方法具體小問題結果合併成大問題答案演算法
 /**
     * 2路歸併排序 1、首先將整體分成兩部分,
     * 對每一部分進行排序,(遞迴),將每一部分再進分成兩部分,直至不可再分
     * 2、將左右兩部分進行合併,最終合併成有序陣列
     * @param arr
     * @return
     */
    public static int[] mergeSort(int[] arr) {
        if (null == arr || arr.length == 0 || arr.length == 1)
            return arr;
        int start = 0;
        int end = arr.length - 1;
        recusion(arr, start, end);
        return arr;
    }

    /**
     * 遞迴呼叫方法,對確定範圍內分左右兩側進行排序
     * 
     * @param arr
     * @param start
     * @param end
     */
    private static void recusion(int[] arr, int start, int end) {
        if (start >= end)
            return;
        int mid = start + (end - start) / 2;
        recusion(arr, start, mid);
        recusion(arr, mid + 1, end);

        merge(arr, start, mid, mid + 1, end);
    }

    /**
     * 合併兩個有序陣列
     * 
     * @param arr
     * @param start
     * @param mid
     * @param mid_plus
     * @param end
     */
    private static void merge(int[] arr, int start, int mid, int mid_plus, int end) {
        if (mid_plus > end)
            return;
        for (int i = mid_plus; i <= end; i++) {
            for (int j = i; j >= start;) {
                while ((j - 1) >= start && arr[j] < arr[j - 1]) {
                    swap(arr, j - 1, j);
                    --j;
                }
                break;
            }
        }

    }

迭代演算法與遞迴演算法思想一致,不列出具體程式碼。1

演算法複雜度

這塊理的不太順,目前直接記住完事
時間:O( nlogn )
空間:O(n)


  1. 嗯,所以仔細想下,迭代非常簡單。 ↩︎

相關文章