【数据结构与算法】二路归并排序

  • 空间复杂度

由于辅助空间刚好要占用那个单元,但每一趟归并后这些空间就被释放了,所以归并排序的空间复杂度是O(n)。

  • 时间复杂度

每趟归并的时间复杂度是O(n),共需要进行log2n趟归并,所以时间复杂度是O(n*log2n)。

  • 代码实现

/**
 * 源码名称:MergeSort.java 
 * 日期:2014-08-11 
 * 程序功能:合并排序 
 * 版权:CopyRight@A2BGeek 
 * 作者:A2BGeek
 */
public class MergeSort {

	public void mergeSort(int[] in, int[] tmp, int start, int end) {
		if (start == end) {
			return;
		} else {
			int mid = (start + end) / 2;
			mergeSort(in, tmp, start, mid);
			mergeSort(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];
		}
	}

	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 };
		int length = testCase.length;
		int tmp[] = new int[length];
		MergeSort mMergeSort = new MergeSort();
		mMergeSort.printArray(testCase);
		mMergeSort.mergeSort(testCase, tmp, 0, length - 1);
		mMergeSort.printArray(testCase);
	}
}



你可能感兴趣的:(数据结构,算法,归并排序)