歸併排序時間複雜度 聽說你還不會歸併排序?

2021-10-11 23:09:16 字數 2848 閱讀 4094

作者 | 超悅人生

責編 | 郭芮

本文介紹了歸併排序的基本思想,遞迴方法的一般寫法,最後一步步手寫歸併排序,並對其效能進行了分析。

基本思想歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法的乙個非常典型的應用。即先使每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。這裡給出一種遞迴形式的歸併排序實現。

遞迴方法的一般寫法遞迴方法的書寫主要有三步:

遞迴方法均可按照這三步進行,切忌不要陷入遞迴實現的細節中。下面以歸併排序演算法的書寫為例,來談一下遞迴方法的具體寫法。

手寫歸併排序首先,明確遞迴方法的功能,這裡我們定義方法的功能為,給定乙個陣列及左右邊界,方法完成陣列邊界內元素的排序,如下:

private static void mergesort(int arr,int left,int right);
先假設我們已經有了這麼乙個方法,不用管具體的實現。

接著,尋找遞推關係,什麼是遞推關係呢?就是如何由子問題的求解,來得到原問題的求解,還是舉例說明,有如下的陣列:

我們將其拆分為左右兩部分,如下:

遞推關係就是,假如左右兩部分都已經有序了,如何使整個陣列有序?這個問題其實就是給定了乙個陣列,陣列的左半部分有序,右半部分也有序,如何使整個陣列有序?

首先,定義兩個指標,分別指向左側部分起始位置和右側部分起始位置,同時建立乙個輔助陣列和指向其初始位置的輔助指標:

接著比較,左指標和右指標所對應的元素的大小,較小的元素填充至輔助陣列,同時其對應的指標和輔助指標均加1,如下:

依次進行,直至某左指標指向中間位置或者右指標指向陣列的末尾,此時要將將剩餘的元素填充至輔助陣列。所有的元素填充完成後,再將輔助陣列中的元素填充回原陣列即可。具體的**如下:

/**     *     * @param arr 要合併的陣列     * @param left 左邊界     * @param mid 中間的分界     * @param right 右邊界     */    private static void merge(int arr,int left,int mid,int right)        while(lpoint <= mid)        while(rpoint <= right)        for(int j = 0;j < helparr.length;j ++)    }
最後,確定終止條件,一般是陣列為空或者陣列中只有乙個元素,返回即可。

現在我們可以寫出整個歸併排序的**了,如下:

private static void mergesort(int arr,int left,int right)
為了保證形式的統一,再對函式進行一下封裝,如下,這就是我們的歸併排序了。
/**     * 歸併排序演算法     * @param arr     */    public static void mergesort(int arr)
至此,我們便完成了歸併排序演算法的**實現。

效能分析在分析歸併排序演算法效能之前,先介紹幾個基礎的概念。

下面我們分析下歸併排序演算法的效能。

首先是時間複雜度。歸併排序演算法在排序時首先將問題進行分解,然後解決子問題,再合併,所以總時間=分解時間+解決子問題時間+合併時間。分解時間就是把乙個陣列分解為左右兩部分,時間為一常數,即o(1);解決子問題時間是兩個遞迴方法,把乙個規模為n的問題分成兩個規模分別為n/2的子問題,時間為2t(n/2);合併時間複雜度為o(n)。所以總時間t(n)=2t(n/2)+o(n)。這個遞迴問題的時間複雜度可以用下面的公式來計算

這個公式可針對形如:t(n) = at(n/b) + f(n)的遞迴方程進行時間複雜度求解。帶入可知,歸併排序的時間複雜度為o(nlogn)。此外在最壞、最佳、平均情況下歸併排序時間複雜度均為o(nlogn)。

☞go 之禪

☞鹿晗都有 ai 粉了,為什麼 ai 換臉劇的效果還這麼渣?

☞迴圈智慧型楊植麟:「人機耦合」將是對話語義應用的新趨勢!

☞曾遭周鴻禕全網**的360猛將:草根打工到36歲身家上億的逆襲!

☞詳kubernetes在邊緣計算領域的發展

☞原來疫情發生後,全球加密社群為了抗擊冠狀病毒做了這麼多事情!

☞一文讀懂「情感計算」在零售中的應用發展

歸併排序時間複雜度分析

主要參考了他的博文,他還講解了其他排序的時間複雜度分析及演算法實現。可以說合併排序是比較複雜的排序,特別是對於不了解分治法基本思想的同學來說可能難以理解。總時間 分解時間 解決問題時間 合併時間。分解時間就是把乙個待排序序列分解成兩序列,時間為一常數,時間複雜度o 1 解決問題時間是兩個遞迴式,把乙...

歸併排序時間複雜度分析

歸併 public void static main int leftarray newint num 2 public void static sort int begin,int end,int array,int leftarray public void static merge int b...

歸併排序時間複雜度 主定理

這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線...