Java MergeSort

代码如下:

public static void main(String[] args) {
	int[] array = { 1, 6, 4, 5, 2, 9, 7, 23, 56, 43, 98, 56, 11 };
	int[] temp = new int[array.length];
	mergeSort(array, temp, 0, array.length - 1);
	StringBuilder sb = new StringBuilder();
	for (int a : array) {
		sb.append(a + " ");
	}
	System.out.println(sb);
}

public static void mergeSort(int[] array, int[] temp, int start, int end) {
        //只有一个数据,不用排序了
	if (start >= end) {
		return;
	}
        //这里不能写成int mid = (end - start + 1) / 2 + start,否则start为0,end为1会出问题
	int mid = (start + end) / 2; 
	mergeSort(array, temp, start, mid);
	mergeSort(array, temp, mid + 1, end);
	merge(array, temp, start, mid, end);
}

public static void merge(int[] array, int[] temp, int start, int mid, int end) {
	int leftIndex = start;
	int rightIndex = mid + 1;
	int tempIndex = start;
	while (leftIndex <= mid && rightIndex <= end) {
		if (array[leftIndex] <= array[rightIndex]) {
			temp[tempIndex++] = array[leftIndex++];
		} else {
			temp[tempIndex++] = array[rightIndex++];
		}
	}

	while (leftIndex <= mid) {
		temp[tempIndex++] = array[leftIndex++];
	}

	while (rightIndex <= end) {
		temp[tempIndex++] = array[rightIndex++];
	}

	for (int index = start; index <= end; index++) {
		array[index] = temp[index];
	}
}

或者如下:

public static void main(String[] args) {
	int[] array = { 1, 6, 4, 5, 2, 9, 7, 23, 56, 43, 98, 56, 11 };
	mergeSort(array, 0, array.length - 1);
	StringBuilder sb = new StringBuilder();
	for (int a : array) {
		sb.append(a + " ");
	}
	System.out.println(sb);
}

public static void mergeSort(int[] array, int start, int end) {
	if (start >= end) {
		return;
	}
        //这里不能写成int mid = (end - start + 1) / 2 + start,否则start为0,end为1会出问题
	int mid = (start + end) / 2;
	mergeSort(array, start, mid);
	mergeSort(array, mid + 1, end);
	merge(array, start, mid, end);
}

public static void merge(int[] array, int start, int mid, int end) {
	int[] tmpArray = new int[(end - start + 1)];
	int rightIndex = start;
	int leftIndex = mid + 1;
	int tmpIndex = 0;
	while (rightIndex <= mid && leftIndex <= end) {
		if (array[rightIndex] <= array[leftIndex]) {
			tmpArray[tmpIndex++] = array[rightIndex++];
		} else {
			tmpArray[tmpIndex++] = array[leftIndex++];
		}
	}

	while (rightIndex <= mid) {
		tmpArray[tmpIndex++] = array[rightIndex++];
	}

	while (leftIndex <= end) {
		tmpArray[tmpIndex++] = array[leftIndex++];
	}

	tmpIndex = 0;
	for (int i = start; i <= end; i++) {
		array[i] = tmpArray[tmpIndex++];
	}

}

20201215172849451.png

复杂度分析:

  • 时间复杂度
    对n个元素归并排序 可看为对两组n/2个元素归并排序并调用Merge函数一次
    所以T(n)=2T(n/2)+an=4T(n/4)+2an=…=2kT(n/2k)+kan
    一直做到n/2k=1,则k=log2n,n=2k
    则T(n)=2kT(1)+kan=n+a*(log2n)n
    时间复杂度即为O(nlgn)
    注:算法导论中lgN默认都是以2为底的

  • 空间复杂度
    最大为O(n)

  • 简单理解
    树有进行log2n层,每层n个元素,每层的复杂度(n/2+n+n:进行n/2次比较,n次赋值到中间数组,n次赋值到原始数组)
    所以时间复杂度为O(nlog2n)

posted @ 2021-02-22 15:22  david123102  阅读(100)  评论(0)    收藏  举报