【递归求解】合并排序

 

算法描述: 对n个元素进行排序

 

算法思想: 将待排序元素分成大小大致相同的2个子集合,分别对2个集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合.

 

实现程序:

/**
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
 * All right reserved.
 *
 * Created on 2011
 *
 *		http://jarg.iteye.com/
 *
 */
// Authors:  Jarg Yee <yeshaoting@gmail.com>

/**
 * 合并排序,以小到大排序
 */
public class MergeSort
{
	/** 待排序的数组 */
	private static int[] value = {2,1,4,3,6,5,8,7,9,0};

	/** for debugging. */
	public static void main(String[] args)
	{
		mergeSort(0,value.length-1);
		display();
	}

	/** 合并排序 */
	private static void mergeSort(int beginIndex,int endIndex)
	{
		if(beginIndex<endIndex)
		{
			int mid = (endIndex+beginIndex)/2;	// 分割中点
			mergeSort(beginIndex,mid);			// 分割后左段
			mergeSort(mid+1,endIndex);			// 分割后右段
			merge(beginIndex,endIndex);			// 合并数组
		}
		// beginIndex==endIndex的情况不用处理
	}

	/** 合并段 */
	private static void merge(int beginIndex,int endIndex)
	{
		/* 临时保存排好序的数组 */
		int[] temp = new int[endIndex-beginIndex+1];
		/* 段分界点 */
		int mid = (beginIndex + endIndex)/2;
		int i=beginIndex, j=mid+1, k=0;
		while(i<=mid&&j<=endIndex)
		{
			/* 比较元素大小,按大小依次放入temp中 */
			if(value[i]>=value[j])
			{
				temp[k++] = value[j++];	// 第二段元素加入temp
			}
			else
			{
				temp[k++] = value[i++];	// 第一段元素加入temp
			}
		}

		/* 第一段数组索引i大于段最大标号 */
		if(i>mid)
		{
			/* 把第二段未放入temp中的元素依次放入temp */
			for(int t=j;t<=endIndex;t++)
			{
				temp[k++] = value[t];
			}
		}
		else
		{
			/* 把第一段未放入temp中的元素依次放入temp */
			for(int t=i;t<=mid;t++)
			{
				temp[k++] = value[t];
			}
		}
		/* 把临时保存的已经排好序的数组值覆盖原始值 */
		for(int t=0;t<temp.length;t++)
		{
			value[beginIndex+t] = temp[t];
		}

		//System.out.println("beginIndex:" + beginIndex + "\tendIndex:" + endIndex);
	}

	/** 显示排序后的结果 */
	private static void display()
	{
		for(int i=0;i<value.length;i++)
			System.out.println("value[" + i + "]=" + value[i]);
	}
	
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值