二路歸併排序主要運用了「分治演算法」,分治演算法就是將乙個大的問題劃分為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的有...