二路歸併排序

2021-10-13 12:42:10 字數 1682 閱讀 6111

二路歸併排序主要運用了「分治演算法」,分治演算法就是將乙個大的問題劃分為n個規模較小而結構相似的子問題。

這些子問題解決的方法都是類似的,解決掉這些小的問題之後,歸併子問題的結果,就得到了「大」問題的解。

二路歸併排序主旨是「分解」與「歸併」

分解:1.將乙個陣列分成兩個陣列,分別對兩個陣列進行排序。

2.迴圈第一步,直到劃分出來的「小陣列」只包含乙個元素,只有乙個元素的陣列預設為已經排好序。

歸併:1.將兩個有序的陣列合併到乙個大的陣列中。

2.從最小的只包含乙個元素的陣列開始兩兩合併。此時,合併好的陣列也是有序的。

圖1. 歸併排序過程 圖2. 合併兩個有序陣列

舉例說明:

1.圖中原始陣列為,陣列中元素的個數為8個。首先將8個元素的陣列二分,每次分解後,

陣列中元素的數目為原陣列的一般。直到分解為只含有乙個元素的陣列。

2.將小的陣列按序合併,每次合併後陣列的大小為上層陣列的一倍。此時陣列中的元素都是按序排列的。

3.在合併兩個有序陣列。如圖2

(1) 合併時,有兩個指標分別指向有序陣列a和b的起始元素,比較指標所指元素的大小,如果a[i]較小,則將a[i]
存入陣列c中,並且將i後移。迴圈比較i和j所指的元素。

(2)當乙個陣列a的元素全部排之後,陣列b中的指標就並沒有指向b的末尾位置,將b中剩餘元素全部存入到c中。
1 #include 

2 #include 34

void

merge

(int array,

int p,

int q,

int r);5

void

mergesort

(int array,

int p,

int q);6

7int

main()

8;10int array[8]

=;11int i =0;

1213

mergesort

(array,0,

7);14

//merge(array, 0, 2, 6);

1516

for(i; i <

8; i++)17

printf

("%d "

, array[i]);

18return0;

19}2021

//合併過程中 p<=q22

void

merge

(int array,

int p,

int q,

int r)

2351

52while

(i < n1)

53 array[k++

]= l[i++];

54while

(j < n2)

55 array[k++

]= r[j++];

5657

free

(l);

58free

(r);59}

6061

void

mergesort

(int array,

int p,

int q)

6270

}

歸併排序(二路歸併)

歸併排序是一種遞迴思想的體現,通過多次合併較小的幾個 二路歸併為兩個 有序陣列形成新的有序表。思路 將陣列分為n nn個一元組,兩兩合併得到二元組,以此類推共合併log 2n log 2n log2 n 次後,陣列變得有序。時間複雜度為o n logn o nlogn o nlog n 編譯環境de...

二路歸併排序

不是困難的演算法,不過也是練習了下遞迴。include include include using namespace std const int maxn 100 5 int a maxn int b maxn void mergesort int a,int b,int begin,int en...

二路歸併排序

二路歸併排序是將兩個有序表合併成乙個有序表的排序方法。其基本思想為 序列中有 n個記錄,可以看作為 n個有序子串行,每個序列長度為 1。首先將每相鄰的兩個記錄合併,得到 n 2 個較大的有序子串行,每個序列長度為 2。再將上述子串行兩兩合併,得到 n 2 2 個有序子串行,直至得到乙個長度為 n的有...