"分治"策略
優缺點
要將 [4, 5, 7, 8] 和 [1, 2, 3, 6] 兩個已經有序的子串行,合併為最終序列 [1, 2, 3, 4, 5, 6, 7, 8]。
* 對左右序列進行合併
* @param arr 待排(子)陣列
* @param left 待排陣列首元素索引
* @param mid 中間索引, 用來分割左右兩邊
* @param right 待排陣列尾元素索引
* @param temp 臨時儲存合併後的有序序列
*/public static void merge(int arr, int left, int mid, int right, int temp) // 直到左右兩邊的有序序列有一邊處理完畢為止
// 用三目優化 step1 的 if-else
// temp[t++] = arr[i]<=arr[j] ? arr[i++] : arr[j++];
// 2. 把未處理完的一邊的剩餘資料依次全部填充到 temp 去
// a. 左邊的有序序列還有剩餘元素
while (i <= mid) temp[t++] = arr[i++];
// b. 右邊的有序序列還有剩餘元素
while (j <= right) temp[t++] = arr[j++];
/** 3. 把 temp 的元素拷貝到 arr (並不是每一次都拷貝所有元素)
* (1) left = 0, right = 1
* (2) left = 2, right = 3
* (3) left = 0, right = 3
* (4) left = 4, right = 5
* (5) left = 6, right = 7
* (6) left = 4, right = 7
* (7) left = 0, right = 7
*/// 一定要記得 copy!
t = 0;
while (left <= right) arr[left++] = temp[t++];}}
歸併排序(2 路歸併排序)
遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...
python歸併排序 python 歸併排序
排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...
排序 歸併排序
歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...