經典演算法3 分治法求解歸併排序

2021-06-15 03:55:27 字數 1230 閱讀 9114

/*分治法——歸併排序

* 二路歸併排序的分治策略是:

(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 ...