归并排序

基本原理

该算法是采用分治法,即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

图解

稳定性:稳定的

时间复杂度O(nlogn)

其他:

若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。

若从稳定性来考虑,选择归并排序,堆排序和快速排序都不稳定。

若从平均情况下的排序速度考虑,应该选择快速排序。

public class MergeSort {
	public void mergeSort(int[] a, int left, int right) {
		if (left < right) {
			int middle = (left + right) / 2;
			mergeSort(a, left, middle);
			mergeSort(a, middle + 1, right);
			merge(a, left, middle, right);// 合并
		}
	}

	private void merge(int[] a, int left, int middle, int right) {
		int[] tmpArray = new int[a.length];
		int rightStart = middle + 1;
		int tmp = left;
		int third = left; // 表示下标++
		// 比较两个小数组相应下标位置的数组大小,小的先放进新数组
		while (left <= middle && rightStart <= right) {
			if (a[left] <= a[rightStart]) {
				tmpArray[third++] = a[left++];
			} else {
				tmpArray[third++] = a[rightStart++];
			}
		}
		// 如果左边还有数据需要拷贝,把左边数组剩下的拷贝到新数组
		while (left <= middle) {
			tmpArray[third++] = a[left++];
		}
		// 如果右边还有数据......
		while (rightStart <= right) {
			tmpArray[third++] = a[rightStart++];
		}
       //将数据拷贝到原来的数组中
		while (tmp <= right) {
			a[tmp] = tmpArray[tmp++];
		}
	}

	public static void main(String[] args) {
		MergeSort mergeSort = new MergeSort();
		int[] a = new int[] { 3,5,1,6,4 };
		mergeSort.mergeSort(a, 0, a.length - 1);
		for (int n : a) {
			System.out.print(" " + n);
		}
	}
}

  

原文地址:https://www.cnblogs.com/javabigdata/p/7340603.html