归并排序算法(JAVA)

归并排序算法,先将数组,递归二分,拆分成一个个有序的数组,然后合并;

/**
	 * @Descript:归并排序算法
	 *
	 * @author LanJonah 2018年2月28日
	 * @param array
	 *            需要排序的数组
	 * @return
	 */
	private static int[] mergeSort(int array[]) {
		if (array == null)
			return null;
		sortArray(array, 0, array.length - 1);
		return array;
	}

递归分治:

/**
	 * @Descript:分组
	 *
	 * @author LanJonah 2018年2月28日
	 * @param array
	 *            数组
	 * @param begin
	 *            要排序的数组起始索引
	 * @param end
	 *            要排序的数组结尾索引
	 */
	private static void sortArray(int[] array, int begin, int end) {
		if (begin >= end)
			return;
		int[] tmp = new int[end-begin+1];
		int mid = (begin + end - 1) / 2;
		// 递归分治
		sortArray(array, begin, mid);
		sortArray(array, mid + 1, end);
		// 将两个有序数组合并
		mergeArray1(array, begin, mid, end,tmp);
	}

合并:

比较二个数列的第一个数,谁小就先取谁,取了后放到临时数列。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次放入临时数组末尾。
/**
	 * @Descript:将两个有序数组合并
	 *
	 * @author LanJonah 2018年2月28日
	 * @param array
	 *            数组
	 * @param begin
	 *            起始索引
	 * @param mid
	 *            中间索引
	 * @param end
	 *            结尾索引
	 * @param tmp
	 *            临时数组
	 */
	private static void mergeArray(int[] array, int begin, int mid, int end,int[] tmp) {
		int i = begin, j = mid + 1;
		int m = mid, n = end;
		int k = 0;
		while(i<=m&&j<=n){
			if(array[i]<= array[j])
				tmp[k++] = array[i++];
			else
				tmp[k++] = array[j++];
		}
		
		//当两组数组合并完了之后,如果左边的数组有剩余的值,依次放到临时数组末尾
		while(i<=m)
			tmp[k++] = array[i++];
		while(j<=n)
			tmp[k++] = array[j++];
		//将临时数组的数据放回原来的数组
		for(i=0; i<k;i++ )
			array[begin+i] = tmp[i];
		System.out.println("过程数组:"+Arrays.toString(tmp));
	}




测试:

public static void main(String[] args) {
		int[] array = { 5, 1, 2, 13, 7, 8, 9, 11, 4 };
		System.out.println("初始结果:" + Arrays.toString(array));
		mergeSort(array);
		System.out.println("最终结果:" + Arrays.toString(array));
}

运行结果:


初始结果:[5, 1, 2, 13, 7, 8, 9, 11, 4]
过程数组:[1, 5]
过程数组:[2, 13]
过程数组:[1, 2, 5, 13]
过程数组:[7, 8]
过程数组:[4, 11]
过程数组:[4, 9, 11]
过程数组:[4, 7, 8, 9, 11]
过程数组:[1, 2, 4, 5, 7, 8, 9, 11, 13]
最终结果:[1, 2, 4, 5, 7, 8, 9, 11, 13]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值