归并排序

刚刚开始写博客,就先整理整理最近的练习情况吧。

摘抄个百度百科的释义:

归并排序:是将两个(或两个以上)的有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序的序列。

下面是我用Java来做的实现:

package com.jiangjiang.save.arithmetic;
import java.util.ArrayList;
import java.util.List;

/**
 * 关于归并排序
 * @author yanjiang
 *
 */
public class Test1 {

	public static void main(String[] args){
		int[] A = {1,2,3,4};
		int[] B = {3,4,5,6,7,8};
		
		for(int i : merge(A,B)){
			System.out.print(i+" ");
		}
		System.out.println();
		int[] m = {4,2,12,5,8,10};
		m = sort(m);
		for(int i : m){
			System.out.print(i+" ");
		}
		System.out.println();
	}
	
	/**
	 * 给定两个已经从小到大排序的整数数组A,B,将他们合并成一个新的从小到大排序的数组
	 * @param A
	 * @param B
	 * @return
	 */
	public static int[] merge(int[] A,int[] B){
		//初始化一个新的数组存放合并后的结果
		int[] C = new int[A.length+B.length];
		//利用List存储两个数组中的数
		List<Integer> a = new ArrayList<Integer>();
		for(int i : A){
			a.add(i);
		}
		List<Integer> b = new ArrayList<Integer>();
		for(int i : B){
			b.add(i);
		}
		//i为新数组的下标
		int i = 0;
		//直到a、b中取出所有数据
		while(!(a.isEmpty() && b.isEmpty())){
			if(a.isEmpty()){
				//如果a先为空,则剩下的位置都由b中的数填满
				C[i++] = b.remove(0);
				continue;
			}
			if(b.isEmpty()){
				//如果b先为空,同理
				C[i++] = a.remove(0);
				continue;
			}
			//比较过程,即将较小的数往前放
			if(a.get(0)<b.get(0)){
				C[i++] = a.remove(0);
			}else{
				C[i++] = b.remove(0);
			}
		}
		//最后返回合并结果
		return C;
	}
	
	/**
	 * 利用归并法对一个乱序数组排序
	 * @param nums
	 */
	public static int[] sort(int[] nums){
		int mid = nums.length/2;//二路归并
		if(mid == 0){
			//如果数组中就剩一个数,直接返回
			return nums;
		}
		//获取nums中左右两路的数
		int[] A = new int[mid];
		int[] B = new int[nums.length - mid];
		for(int i = 0;i<A.length; i++){
			A[i] = nums[i];
		}
		for(int i = 0;i<B.length; i++){
			B[i] = nums[mid+i];
		}
		//再分别对左右两路数递归排序
		A = sort(A);
		B = sort(B);
		//最后归并两路,并返回结果
		return merge(A, B);
	}
	
}
百科中说该算法是采用 分治法的一个典型应用。

关于分治法,下次再研究研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值