/*分治法——歸併排序
* 二路歸併排序的分治策略是:
(1)劃分:將待排序序列r1, r2, …, rn劃分為兩個長度相等的子串行r1, …, rn/2和rn/2+1, …, rn;
(2)求解子問題:分別對這兩個子串行進行排序,得到兩個有序子串行;
(3)合併:將這兩個有序子串行合併成乙個有序序列。
*/
public class mergesort ;// 這裡對8個元素進行排序
int low = 0, high = 7;// 初始化low和high的值,即陣列的起始和終止的座標
// 輔助陣列b,作為臨時陣列
int b = new int[a.length];
//輸出排序前的陣列
system.out.print("排序前:");
for (int i = 0; i <= high; i++)
// 歸併排序
mergersort(a, low, high, b);
//輸出排序後的陣列
system.out.print("排序後:");
for (int i = 0; i <= high; i++)
} /**
* 分治和歸併
* * @param a
* @param low
* @param high
* @param b
*/public static void mergersort(int a, int low, int high, int b)
} /**
* 合併兩個有序子串行
* * @param a
* @param low
* @param mid
* @param high
* @param b
* 輔助陣列
*/public static void merger(int a, int low, int mid, int high, int b)
// 如果子串行1沒有合併完則直接複製到複製陣列中去
while (i <= mid)
// 如果子串行2沒有合併完則直接複製到複製陣列中去
while (j <= high)
// 把輔助陣列的元素複製到原來的陣列中去
for (p = 0, i = low; i <= high; i++, p++)
}}
2 3 1 分治法 歸併排序
分治法模式 分解原問題為若干子問題,這些子問題是原問題的規模較小的例項。解決這些子問題,遞迴地求解各子問題。然而,若子問題的規模足夠小,則直接求解。合併這些子問題的解成原問題的解。對於歸併排序 分解 分解待排序的n個元素的序列成各具n 2個元素的兩個子串行。解決 使用歸併排序遞迴地排序兩個子串行。合...
演算法導論學習筆記 2 3 1分治法(歸併排序)
純翻譯 void merge ll a ll p,ll q,ll r else merge函式解析 假設a陣列的兩部分 乙個下標從p到q,乙個從q 1到r 已經排序好了,現在將這兩個排序好的部分陣列再排序,每次比較兩個子陣列的頭元素大小,小的插入,然後出佇列。因為有哨兵的存在,所以一定能排完。純翻譯...
分治法求解逆序數 歸併排序
題目內容 設a1,a2,an是集合的乙個排列,如果iaj,則序偶 ai,aj 稱為該排列的乙個逆序。例如,2,3,1有兩個逆序 3,1 和 2,1 設計演算法統計給定排列中含有逆序的個數。輸入格式 第一行輸入集合中元素個數n,第二行輸入n個集合元素 輸出格式 含有逆序的個數 輸入樣例 32 3 1 ...