作者 | 超悅人生
責編 | 郭芮
本文介紹了歸併排序的基本思想,遞迴方法的一般寫法,最後一步步手寫歸併排序,並對其效能進行了分析。
基本思想歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法的乙個非常典型的應用。即先使每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。這裡給出一種遞迴形式的歸併排序實現。
遞迴方法的一般寫法遞迴方法的書寫主要有三步:
遞迴方法均可按照這三步進行,切忌不要陷入遞迴實現的細節中。下面以歸併排序演算法的書寫為例,來談一下遞迴方法的具體寫法。
手寫歸併排序首先,明確遞迴方法的功能,這裡我們定義方法的功能為,給定乙個陣列及左右邊界,方法完成陣列邊界內元素的排序,如下:
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...
歸併排序時間複雜度 主定理
這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線...