二路归并排序的时间复杂度是O(n*log2n),空间复杂度是O(n)。
代码如下:
/** * 源码名称:MergeSort.java * 日期:2014-08-11 * 程序功能:合并排序 * 版权:[email protected] * 作者:A2BGeek */ public class MergeSort { public void mergeSort(int[] in) { int length = in.length; int tmp[] = new int[length]; mergePass(in, tmp, 0, length - 1); } public void mergePass(int[] in, int[] tmp, int start, int end) { if (start == end) { return; } else { int mid = (start + end) / 2; mergePass(in, tmp, start, mid); mergePass(in, tmp, mid + 1, end); merge2Sub(in, tmp, start, mid, end); } } /** * 函 数 名:merge2Sub * 功能描述:合并相邻的有序表 * 输入参数: * @param a 待排序数组 * @param tmp 临时用于交换数据 * @param start 第一个有序表的起点索引 * @param mid 第一个有序表的终点索引 * @param end 第二个有序表的终点索引 */ public void merge2Sub(int[] a, int[] tmp, int start, int mid, int end) { int i = start; int j = mid + 1; int k = 0; while (i <= mid && j <= end) { if (a[i] <= a[j]) { tmp[k] = a[i]; i++; k++; } else { tmp[k] = a[j]; j++; k++; } } while (i <= mid) { tmp[k] = a[i]; i++; k++; } while (j <= end) { tmp[k] = a[j]; j++; k++; } for (int index = 0; index < end - start + 1; index++) { a[start + index] = tmp[index]; } printArray(a); } public void printArray(int[] in) { for (int i : in) { System.out.print(i + " "); } System.out.println(); } public static void main(String[] args) { int[] testCase = { 1, 3, 4, 10, 2, 5, 6, 7, 9, 11 }; MergeSort mMergeSort = new MergeSort(); mMergeSort.printArray(testCase); mMergeSort.mergeSort(testCase); mMergeSort.printArray(testCase); } }
【数据结构与算法】二路归并排序
时间: 2024-10-11 23:53:52