算法之3--合并排序

合并排序

1.基本设计思想:将原始数组A[0...n-1]中的元素分成两个子数组:A1[0,n/2]和A2[n/2+1,n-1].分别对这两个子数组单独排序,然后将已排序的两个子数组归并成一个含有n个元素的有序数组.

2.与快速排序的联系

a.都是分治的思想.

b.经过一次划分之后,实现对A数组的调整:其中一个子集合的所有元素均小于等于另外一个子集合的所有元素.

C.快速排序按同样的策略对两个子集合进行分类处理.当子集合分类合并后,整个集合的分类也完成了.这个过程避免了子集合的归并操作.

3.图解排序过程(图片转自http://blog.csdn.net/collonn/article/details/17581953)



4.代码(java)


public class Mergesort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] data = new int[] { 1, 14,31, 22, 66};
		int size=data.length;
		Mergesort(data,0,size-1);
		for(int a=0;a<size;a++)
		{
			System.out.print(data[a]+" ");
		}
	}

	private static void Mergesort(int[] data, int start, int end) {
		// TODO Auto-generated method stub
		if(start >= end)
			return ;
		int middle=(start+end) / 2;
		Mergesort(data,start,middle);
		Mergesort(data,middle+1,end);
		Merge(data,start,middle,end);
	}
	//合并排序
	private static void Merge(int[] data, int start, int middle, int end) {
		// TODO Auto-generated method stub
		//这边有个关键点,就是定义一个数组temp数组用来存放重新排序的值
		int temp[]=new int[data.length]; 
		int i=start;
		int j=middle+1;
		int p=start;
		int tmp=start;
		for(;(i<=middle) && (j<=end);p++)
		{
			if(data[i]>data[j])
			{
				temp[p]=data[j++];
			}else
			{
				temp[p]=data[i++];
			}
		}
		while(i <= middle)
		{
			temp[p++]=data[i++];
		}
		
		while(j <= end)
		{
			temp[p++]=data[j++];
		}
	
		while(tmp <= end)
		{
			data[tmp]=temp[tmp++];
		}
				
	}

}















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值