歸併演算法是乙個非常經典的分治演算法,和快速排序有些類似,都是將問題分解成規模更小的子問題,分別解決。但是快速排序的子問題求解完成之後就是最優解,無需進行處理。歸併演算法需要對分別排序完成的子串行進行合併操作。
合併操作非常簡單,定義如下:每次取陣列a和b第乙個元素中較小者放入新的佇列,直到有個隊列為空,然後將另乙個佇列中的元素全部放入新的佇列。
當問題分解成只剩下乙個元素的子問題時,必然有序,成為問題分解的邊界。
**如下:
package datastructureandalgorithms;
public class mergesort {
//temp 傳進來是省去每次重新new的開銷
public static void merge(int a, int first, int mid, int last, int temp) {
int index1 = first;
int index2 = mid + 1;
int k = first;
while(index1 <= mid && index2 <= last){
if(a[index1]輸出:
未排序陣列順序為:
4 2 8 9 5 7 6 1 3
-----------------------
-----------------------
經過歸併排序後的陣列順序為:
1 2 3 4 5 6 7 8 9
分治法排序
分治法排序 1 把大問題分為小問題 2 求每個小問題的解 3 和1反方向,把各個解合併起來 實現 1 啟用兩個快取,乙個放前半部份問題,乙個放後半部份問題 2 只用乙個大快取,用index的大小區分問題規模 include include void megre pre int pre,int fir...
分治法排序
include include define temp 10 int a temp int b temp void merge int low,int mid,int high else k while i mid while j high for i 0 i k i b low i a i int...
分治 快速排序
快速排序陣列元素的思想 1 設k a 0 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 o n 時間完成 2 把k左邊的部分快速排序 3 把k右邊的部分快速排序 class program quicksort a,0,a.length 1 ...