分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。 归并排序算法基本流程:
分解待排序的n个元素的序列成各具n/2个元素的两个子序列;使用归并排序递归地排序两个子序列;合并两个已排序的子序列以产生已排序的答案。Java代码实现:
class Mergesort { public static void main(String[] args) { int[] arr = {5, 2, 4, 6, 1, 3}; merge_sort(arr, 0, arr.length - 1); for (int a : arr) { System.out.print(a + ","); } } // 归并排序 private static void merge_sort(int[] arr, int i, int j) { if (i < j) { int q = (i + j) / 2; // 分成左右两部分,递归调用排序算法 merge_sort(arr, i, q); merge_sort(arr, q + 1, j); merge(arr, i, q, j); } } // 排序两个已排序的序列 private static void merge(int[] arr, int i, int q, int j) { int[] left = new int[q - i + 1]; System.arraycopy(arr, i, left, 0, left.length); int[] right = new int[j - q]; System.arraycopy(arr, q + 1, right, 0, right.length); int m = 0, n = 0, k = i; while (m < left.length && n < right.length) {// 左右两个数组比较,将小的复制到arr[]中 if (left[m] <= right[n]) { arr[k] = left[m]; m++; } else { arr[k] = right[n]; n++; } k++; } if (m == left.length) {// 左边被复制完 for (int x = n; x < right.length; x++) { arr[k] = right[x]; k++; } } else {// 右边被复制完 for (int y = m; y < left.length; y++) { arr[k] = left[y]; k++; } } } }归并排序的时间复杂度为O(nlgn)。
