算法:分治法之归并排序

一、归并的思想

是分治算法的完美体现

步骤一:拆解算法

a.找出分解点,在此处是是中间点拆分,拆成左右俩个数组。

b.左、右俩个数组采用同样的方式拆解,一直循环拆,直到拆到一个元素为止(因为一个元素本身就是有序的特性),

步骤二:合并算法(利用俩个有序的数组比较简单合并的思路,进行合并)

二、代码展示

package com.yan.algorithm.devide;

public class Merge {
	
	/**
	 * 合并算法,调用的前提条件是:
	 * 1.下标low -> mid 有序
	 * 2.下标 mid + 1 -> high 有序
	 */
	public static void mergeSort(int[] a, int low, int mid, int high) {
		int i = low, j = mid + 1;// 俩个子数组的活动游标
		int[] b = new int[high - low + 1];// 辅助数组
		int k = 0;// 辅助数组下标

		while (i <= mid && j <= high) {// 将小的元素放入辅助数组
			if (a[i] <= a[j]) {
				b[k++] = a[i++];
			}
			if (a[i] > a[j]) {
				b[k++] = a[j++];
			}
		}

		while (i <= mid) {//将左边数组中剩余的 i->mid 中的数据放入辅助数组
			b[k++] = a[i++];
		}
		while (j <= high) {//将右边数组中剩余的 j->high 中的数据放入辅助数组
			b[k++] = a[j++];
		}
		
		for(int m = 0; m < b.length; m++) {
			a[low + m] = b[m];
		}
	}
	
	//拆分,调用合并算法
	public static void merge(int[] a, int low, int high) {
		if(low == high) {//一个元素是有序的,不需要排序
			return ;
		}
		int mid = (low + high) / 2;
		merge(a, low, mid);
		merge(a, mid + 1, high);
		mergeSort(a, low, mid, high);
	}
	
	public static void main(String[] args) {
		int[] a = {5, 2, 50, 1, 29, 45, 35};
		merge(a, 0, a.length - 1);
		
		for(int t : a) {
			System.out.println(t);
			
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值