现在的位置: 首页 > 综合 > 正文

归并排序

2013年12月16日 ⁄ 综合 ⁄ 共 946字 ⁄ 字号 评论关闭

归并排序

public class MergeSort {

	public static int[] Sort(int[] a) {
		/* 此处使用和原数组大小一样的数组 */
		int[] b = new int[a.length];/*额外的数组空间*/
		mergeSort(a, b, 0, a.length - 1);
		return a;
	}

	private static void mergeSort(int[] a, int[] b, int low, int high) {
		if (low < high) {
			int mid = (low + high) / 2;
			/*不断进行递归分解,直到合并的长度为1时找到递归出口,开始沿递归路径向上走*/
			mergeSort(a, b, low, mid);
			mergeSort(a, b, mid + 1, high);
			merge(a, b, low, mid, high);
		}
	}
	
	private static void merge(int[] a, int[] b, final int left, final int center,
			final int right) {
		
		int bPos = left;/*临时数组的索引*/
		
		/*使用以下临时变量主要用于便于理解,不易产生混淆*/
		int leftStart = left;/*左起始点*/
		int leftEnd = center;/*左结束点*/
		int rightStart = center + 1;/*右起始点*/
		int rightEnd = right;/*右结束点*/

		/*在两个左右分解数组中选出最小的一个放入临时数组中*/
		while (leftStart <= leftEnd && rightStart <= rightEnd) {
			if (a[leftStart] <= a[rightStart])
				b[bPos++] = a[leftStart++];
			else {
				b[bPos++] = a[rightStart++];

			}
		}
		
		/*如果有剩余直接复制到临时数组里*/
		while (leftStart <= leftEnd) {
			b[bPos++] = a[leftStart++];
		}
		while (rightStart <= rightEnd) {
			b[bPos++] = a[rightStart++];
		}
		
		/*将临时数组中排好序的部分复制到原数组中*/
		for (int i = left; i <= right; i++) {
			a[i] = b[i];
		}
	}
}

抱歉!评论已关闭.