演算法導論學習筆記 2 3 1分治法(歸併排序)

2021-10-03 02:36:53 字數 1183 閱讀 9283

純翻譯**

void

merge

(ll a[

],ll p,ll q,ll r)

else

}}

merge函式解析:

假設a陣列的兩部分(乙個下標從p到q,乙個從q+1到r)已經排序好了,現在將這兩個排序好的部分陣列再排序,每次比較兩個子陣列的頭元素大小,小的插入,然後出佇列。因為有哨兵的存在,所以一定能排完。

純翻譯**

void

mergesort

(ll a[

],ll p,ll r)

}

mergesort函式解析:

遞迴解決問題,對半分開陣列,對每個子陣列排序,再整合

總結:分治法

將乙個問題劃分為若干個子問題。

遞迴的解決每乙個子問題。

將子問題的解合併成為整個大問題的解。

歸併排序

將乙個陣列分為兩個子陣列。

遞迴的對每乙個子陣列進行排序。

合併兩個有序子陣列。

時間複雜度 θ(nlgn)

合併**

#include

using

namespace std;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;const

int maxn=

1000000

;ll n,a[maxn]

,l[maxn]

,r[maxn]

,i,j,k;

void

merge

(ll a[

],ll p,ll q,ll r)

else}}

void

mergesort

(ll a[

],ll p,ll r)

}int

main()

《演算法導論》 2 3 1分治法

分治法 有很多演算法在結構上是遞迴的 為了解決乙個給定的問題,演算法要一次或多次地遞迴地呼叫其自身來解決相關的問題。這些演算法通常採用分治策略 將原問題劃分為n個規模較小而結構與原問題相似的子總是 遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。分治模式在每一層遞迴上都有三個步驟 分解 d...

2 3 1 分治法 歸併排序

分治法模式 分解原問題為若干子問題,這些子問題是原問題的規模較小的例項。解決這些子問題,遞迴地求解各子問題。然而,若子問題的規模足夠小,則直接求解。合併這些子問題的解成原問題的解。對於歸併排序 分解 分解待排序的n個元素的序列成各具n 2個元素的兩個子串行。解決 使用歸併排序遞迴地排序兩個子串行。合...

演算法複習筆記(三)分治法

演算法複習筆記 三 分治法 分治法劃分對策 子問題與原問題相比 問題性質一致,問題規模不同 求解一般分為三個階段 1.劃分 直到問題足夠小可以直接求解為止 2.求解 3.合併 將子問題的解合併為乙個更大規模的問題的解,自底向上逐步求出原問題的解。我們給出下面這個理智引入分治技術 不是所有的分治法都比...