归并排序

public class test1 {

	public static void main(String[] args) {
		int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
		sort(data, 0, data.length - 1);
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i]+" " );
		}
	}
	public static void sort(int[] data, int left, int right) {
		if (left < right){
			
		int center = (left + right) / 2;
		sort(data, left, center);
		sort(data, center + 1, right);
		merge(data, left, center, right);
		}
	}

	public static void merge(int[] data, int left, int center, int right) {
		// 临时数组
		int[] tmpArr = new int[data.length];
		// 右数组第一个元素索引
		int mid = center + 1;
		// third2 记录临时数组的索引
		int third2 = left;
		// 缓存左数组第一个元素的索引
		int tmp = left;
		while (left <= center && mid <= right) {
			// 从两个数组中取出最小的放入临时数组
			if (data[left] <= data[mid]) {
				tmpArr[third2++] = data[left++];
			} else {
				tmpArr[third2++] = data[mid++];
			}
		}
		// 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)
		while (mid <= right) {
			tmpArr[third2++] = data[mid++];
		}
		while (left <= center) {
			tmpArr[third2++] = data[left++];
		}
		// 将临时数组中的内容拷贝回原数组中
		// (原left-right范围的内容被复制回原数组)
		while (tmp <= right) {
			data[tmp] = tmpArr[tmp++];
		}
	}


}

  

posted @ 2014-09-12 00:11  蓦然回首的包子  阅读(154)  评论(0)    收藏  举报