在引入歸併排序之前,先簡單介紹分治法,因為歸併排序的主要思想就是分治
許多有用的演算法結構都是遞迴的,為了解決乙個問題,遞迴的呼叫其自身來解決該問題的**成的若干個子問題。
分治法的主要思想就是:將原問題分解成若干個類似的,具有相同性質的子問題,然後遞迴的求解這些子問題,直到乙個返回條件不再遞迴的呼叫自身,最後自下而上的將子問題的解合併起來,構成原問題的解,我們這裡的歸併排序就是基於此核心思想的
分治在每層遞迴都有三個步驟:
分解原問題為若干個相似的子問題,這些子問題是原問題的較小規模的例項
解決這些子問題,遞迴的求解這些子問題,直到到較小規模的子問題,直接解決
合併子問題的解成原問題的解
上面介紹的解決分治問題的思想用在這裡的歸併排序上:
分解輸入的具有n個元素的序列,然後將該序列分解成兩個n/2大小的子串行
遞迴的求解兩個大小為n/2的子串行,直到遇到不能再分成子串行(只有乙個元素的時候),就不再遞迴呼叫,而是直接求解,因為只有乙個元素的時候,那麼這個序列一定是有序的
歸併各個階段的子問題的解,最後構成原問題的解
比如現在有乙個陣列:,,現在需要將該陣列分解成兩個子陣列:和,然後再將這個兩個子陣列分解成對應的子陣列:,和和,以此類推,直到子陣列只剩下乙個元素
當只有乙個元素的時候,那麼就開始自下而上的將子問題歸併(此處按照公升序來實現) 比如
這個分解到最終的子串行,那麼就將,,將10和6進行相比較,發現6明顯小於10,就將6放在10的前面,於是就得到了
,那麼再將上乙個子問題得到的解array1=與array2=進行歸併,分別去除array1和array2的第乙個元素,發現小於,那麼就將array1的第乙個元素取出來放在乙個新的陣列裡面temp=,再次去除array1和array2的第乙個元素比較,發現大於,那麼就將放入temp裡面得到,最後將10放入temp裡面得到乙個有序的子串行
我們發現,歸併此子問題都是基於上乙個子問題的解已經有序的基礎上面進行的,因為每次都需要將第乙個元素拿出來比較,第乙個元素也就是序列裡面最小的那個元素,通過將所有子問題進行歸併求解得到:
**實現如下:
#include #include #include //歸併排序的核心操作
//輸入乙個子陣列,具有左邊界left以及右邊界right
void merge(int subarray,const int left, const int right)
if(left >= right)
return;
int center = (left+right)/2;
merge(subarray,left,center);
merge(subarray,center+1,right);
//建立兩個子陣列
int leftarraylength = center-left+2;
int rightarraylength = right-center+1;
int leftsubarray[leftarraylength];//這裡需要新增乙個無窮大的哨兵,避免每次的邊界檢測
int rightsubarray[rightarraylength];
int i,j;
int k;
/* printf("%d+++%d\n",leftarraylength,rightarraylength );
printf("%s+++++++center:%d++++left:%d+++++right:%d+++\n","left",center,left,right );
*/ for(i=0;i= rightsubarray[j])
else
}}void mergesort(int inputarray ,const int arraylength)
int main(int argc, char const *argv)
; mergesort(array,sizeof(array)/sizeof(int));
for(i=0;i
最後得到排序的結果:
演算法效率分析:
可知這裡採用二分法來實現的,所以對應的輸入規模為n排序所需的單位時間為:t(n)=2t(n/2)+d(n)+c(n)
那麼知道:
求解上面的方程可知歸併排序的時間複雜度為:theta(nlogn)
歸併排序 Merge sort
merge the a s.m and a m 1.t to r s.t template void two merge typet a,typet r,int s,int m,int t while i m r k a i while j t r k a j merge the a 0.n 1 s...
歸併排序(merge sort)
歸併排序 歸併排序是一種遞迴排序演算法,無論陣列元素的原始順序如何,其效能恆定不變。將陣列一分為二,分別排序兩部分元素,再將有序的兩半陣列歸併為乙個有序陣列。歸併步驟比較陣列前一半的元素與陣列的後一半元素,並將較小元素移到臨時陣列,該過程繼續前進,直到其中一半再沒有元素為止。此後只需將其餘元素移到臨...
歸併排序 Merge Sort
歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...