歸併排序演算法

2021-08-27 08:51:41 字數 1039 閱讀 7083

一,歸併排序介紹

歸併排序是乙個典型的基於分治的遞迴演算法。它不斷地將原陣列分成大小相等的兩個子陣列(可能相差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 下面採用遞迴排...