一,歸併排序介紹
歸併排序是乙個典型的基於分治的遞迴演算法。它不斷地將原陣列分成大小相等的兩個子陣列(可能相差1),最終當劃分的子陣列大小為1時(下面**第17行left小於right不成立時) ,將劃分的有序子陣列合併成乙個更大的有序陣列。為什麼是有序子陣列???
歸併排序的遞迴公式:t(n) = 2t(n/2) + o(n)
從公式中可以看出:將規模為 n 的原問題分解成兩個規模 n/2 的兩個子問題;並且,合併這兩個子問題的代價是 o(n)---[後面的 +o(n) 表示合併的代價]
二,歸併排序演算法分析
歸併排序演算法有兩個基本的操作,乙個是分,也就是把原陣列劃分成兩個子陣列的過程。另乙個是治,它將兩個有序陣列合併成乙個更大的有序陣列。
它將陣列平均分成兩部分: center = (left + right)/2,當陣列分得足夠小時---陣列中只有乙個元素時,只有乙個元素的陣列自然而然地就可以視為是有序的,此時就可以進行合併操作了。因此,上面講的合併兩個有序的子陣列,是從 只有乙個元素 的兩個子陣列開始合併的。
合併後的元素個數:從 1-->2-->4-->8......
比如初始陣列:[24,13,26,1,2,27,38,15]
①分成了兩個大小相等的子陣列:[24,13,26,1] [2,27,38,15]
②再劃分成了四個大小相等的子陣列:[24,13] [26,1] [2,27] [38,15]
③此時,left < right 還是成立,再分:[24] [13] [26] [1] [2] [27] [38] [15]
此時,有8個小陣列,每個陣列都可以視為有序的陣列了!!!,每個陣列中的left == right,從遞迴中返回(從19行--20行的**中返回),故開始執行合併(第21行):
merge([24],[13]) 得到 [13,24]
merge([26],[1]) 得到[1,26]
最終得到 有序陣列。
歸併演算法 歸併排序
歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...
歸併排序演算法
include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...
歸併排序演算法
這個演算法感覺比插入難理解一些,下面說說我的理解 歸併排序的步驟 1.把長度為n的序列分為兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個子串行合併成乙個最終的排序序列 通過步驟2可看到 在歸併排序中又用了歸併排序,可見這是乙個遞迴的過程。例如乙個陣列 a 8 下面採用遞迴排...