一、基本思想
對於乙個待排序的序列,遞迴地將前半部分資料和後半部分資料各自歸併排序,得到排序後的兩部分資料,然後合併這兩個部分。
歸併演算法採用分而治之的策略:a. 將問題分成一些小的問題然後遞迴求解;
b. 將分的階段解得的各個答案「修補」到一起。
可以看到這種結構很像一棵完全二叉樹,故我們可以採用遞迴來實現歸併排序。
二、分階段可以理解為就是遞迴拆分子序列的過程
由上圖可知遞迴深度為logn,故其時間複雜度為o(logn)。
三、治階段可以理解為就是合併相鄰有序子串行的過程
我們需要將兩個已經有序的子串行合併成乙個有序序列。因為這兩個輸入子串行是有序的,所以若將輸出放到第三個序列中時,則該演算法可以通過對輸入資料一趟排序來完成。即合併兩個有序子串行的時間複雜度為o(n)。
比如上圖中的最後一次合併,要將[4,5,7,8]和[1,2,3,6]兩個已經有序的子串行,合併為最終序列[1,2,3,4,5,6,7,8],下圖為對應的實現步驟。
四、**
/* 歸併排序 */void mergesort(int a, int n)
void sort(int a, int left, int right, int temp)
}void merge(int a, int lpos, int rpos, int rightend, int temp)
while(lpos <= leftend)
temp[temppos++] = a[lpos++];
while(rpos <= rightend)
temp[temppos++] = a[rpos++];
// 拷貝到陣列a中
for(int i = 0; i < elementnum; ++i, --rightend)
a[rightend] = temp[rightend];
}
排序4 歸併排序
歸併排序 merge sort 完全遵循上述分治法三個步驟 1 分解 將要排序的n個元素的序列分解成兩個具有n 2個元素的子串行 2 解決 使用歸併排序分別遞迴地排序兩個子串行 3 合併 合併兩個已排序的子串行,產生原問題的解。所以說歸併排序一種分治演算法的典型應用。歸併排序過程動態演示 時間複雜度...
排序4 歸併排序
3.海量資料的排序問題 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。歸併排序適合於外部排序,也可以適用於鍊錶排序。外部排序 指的是資料儲存在磁碟上。鍊錶排序 希爾 堆排序 快速排序等均不適...
4 歸併排序演算法
1 歸併排序 merge sort 基本思想 歸併排序法是將兩個或兩個以上的有序表合併成乙個新的有序表 即將待排序的序列分成若干個子串行,每個子串行是有序的,然後再把有序子串行合併為整體子串行 利用歸併的思想實現二路歸併排序的實現步驟 首先將整個資料表看成是n個有序子表,每個子表長度為1 當然有序啦...