排序-归并排序

主要内容:

分解:把序列按一定长度(1、2、4、8……)划分成若干部分

合并:将划分后的序列两两合并

204142_2URp_2662344.png

(来源:http://www.cnblogs.com/jingmoxukong/p/4308823.html )


java代码:

public class MergeSort {

	public static void main(String[] args) {
		int[] array = { 2, 3, 5, 1, 4, 6, 8, 7 };
		mergeSort(array, 1);
		printArray(array);
	}

	// 每个分组有d个元素
	public static void mergeSort(int[] array, int d) {
		if (d == array.length)
			return;
		// 当数组长度不是2的整数次方时会导致无法完美分割,最后会有一个长序列和一个短序列,此时需要额外进行一次合并
		if (d > array.length) {
			System.out.print("d=" + d + "/2=" + d / 2 + ": ");
			merge(array, 0, d / 2 - 1, array.length - 1);
			return;
		}
		for (int i = 0; i + 2 * d - 1 < array.length; i = i + 2 * d) {
			merge(array, i, i + d - 1, i + 2 * d - 1);
		}
		System.out.print("d=" + d + ":  ");
		printArray(array);
		mergeSort(array, d * 2);
	}

	// 合并array[left,mid] 和 array[mid+1,right]两个区间,这两个区间已经是有序的了
	private static void merge(int[] array, int left, int mid, int right) {
		int[] temp = new int[right - left + 1];
		int l = left, r = mid + 1, t = 0;
		while (l <= mid && r <= right) {
			if (array[l] < array[r])
				temp[t++] = array[l++];
			else
				temp[t++] = array[r++];
		}
		while (l <= mid) {
			temp[t++] = array[l++];
		}
		while (r <= right) {
			temp[t++] = array[r++];
		}
		for (int i = left, j = 0; i <= right; i++, j++) {
			array[i] = temp[j];
		}
	}

	private static void printArray(int[] array) {
		for (int i = 0; i < array.length - 1; i++)
			System.out.print(array[i] + ",");
		System.out.println(array[array.length - 1]);
	}
}


测试:

int[] array = { 2, 3, 5, 1, 4, 6, 8, 7 };

输出:

d=1:  2,3,1,5,4,6,7,8

d=2:  1,2,3,5,4,6,7,8

d=4:  1,2,3,4,5,6,7,8

1,2,3,4,5,6,7,8

//

int[] array = { 2, 3, 5, 1, 4 };

输出:

d=1:  2,3,1,5,4

d=2:  1,2,3,5,4

d=4:  1,2,3,5,4

d=8/2=4: 1,2,3,4,5


转载于:https://my.oschina.net/liujiest/blog/669865

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值