經典算法3:分治法求解歸并排序
/分治法——歸并排序
二路歸并排序的分治策略是:
(1)劃分:將待排序序列r1, r2, …, rn劃分為兩個長度相等的子序列r1, …, rn/2和rn/2+1, …, rn;
(2)求解子問題:分別對這兩個子序列進行排序,得到兩個有序子序列;
(3)合并:將這兩個有序子序列合并成一個有序序列。
*/
public class MergeSort {
/**
* @param args
*/
public static void main(String[] args) {
int a[] = { 21, 34, 56, 43, 99, 37, 78, 10 };// 這里對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++) {
System.out.print(a[i] + " ");
}
// 歸并排序
mergerSort(a, low, high, b);
//輸出排序后的數組
System.out.print("排序后:");
for (int i = 0; i <= high; i++) {
System.out.print(a[i] + " ");
}
}
/**
* 分治和歸并
*
* @param a
* @param low
* @param high
* @param b
*/
public static void mergerSort(int a[], int low, int high, int b[]) {
int mid = 0;
if (low < high) {
mid = (high + low) / 2;// 分治位置,即將數組拆分的位置
mergerSort(a, low, mid, b);
mergerSort(a, mid + 1, high, b);
merger(a, low, mid, high, 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[]) {
int i = low;
int j = mid + 1;
int p = 0;
// 合并兩個有序數組 子序列1 a[low..mid] 子序列2 a[mid+1..high]
while (i <= mid && j <= high) {
b[p++] = (a[i] <= a[j]) ? a[i++] : a[j++];
}
// 如果子序列1沒有合并完則直接復制到復制數組中去
while (i <= mid) {
b[p++] = a[i++];
}
// 如果子序列2沒有合并完則直接復制到復制數組中去
while (j <= high) {
b[p++] = a[j++];
}
// 把輔助數組的元素復制到原來的數組中去
for (p = 0, i = low; i <= high; i++, p++) {
a[i] = b[p];
}
}
} </pre>
本文由用戶 cwf8 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!