18 歸併排序

2022-08-02 08:15:12 字數 1479 閱讀 4787

"分治"策略

優缺點

要將 [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 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...