合并排序(Merge-sort)

排序问题
输入:n个数(a1,a2,a3...)

输出:输入序列的一个重排列(a1',a2',a3'...),使得a1'>=a2'>=a3'....

合并排序算法基本过程:(1)假设存在两个有序的序列A、B(有序方向一致),那么将两个序列合成一个有序序列C(有序方向一致)的过程为,设定指标a、b、c分别为三个序列的指标,初始位置分别在各自序列头部,如果A[a]>B[b],则C[c]=A[a]并且a++、c++;否则C[c]=B[b],并且b++、c++;直到A、B其中某个序列达到尾部,然后将未到尾部序列的后面部分逐步复制给C;(2)一个序列只包含一个元素,设定为有序序列,且任意两个单元素序列的有序方向都是一致的;(3)将一串无序序列进行取半分解,在对已经取半的序列进行取半分解,则最终得到一系列的单元素序列,即得到一系列有序序列;(4)这一系列序列两临近进行第(1)步中的排序操作,直到合成一个完成的序列。

上述基本过程即对分治策略中的分解、解决、合并进行了简单的描述,亦递归过程的简要描述,实现代码如下:

import java.util.*;

public class MergeSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("请输入需要排序的一组数字并以空格隔开(5 8 9.。。):");
		Scanner myScanner = new Scanner(System.in);
		String tempStr = myScanner.nextLine();
		myScanner.close();
		String[] str = tempStr.split(" ");
		int[] myData = new int[str.length];
		int[] sortedData = new int[str.length];
		for(int i=0;i<str.length;i++)
		{
			myData[i]=Integer.parseInt(str[i]);
		}
		
		MergeSort myMergeSort = new MergeSort();
		myMergeSort.mergesort(myData,0,myData.length-1,sortedData);
		
		for(int i=0;i<str.length;i++)
			System.out.print(sortedData[i]+" ");
		System.out.println();
		System.out.println("转换完成");
	}
	
	private void mergesort(int[] tempData,int startnum,int endnum,int[] sorted)
	{
		if(startnum!=endnum)
		{
			int mid=(startnum+endnum)/2;
			mergesort(tempData,startnum,mid,sorted);
			mergesort(tempData,mid+1,endnum,sorted);

		
			int i=startnum,j=mid+1,m=startnum;
			while((i<mid+1)&&(j<endnum+1))
			{
				if(tempData[i]>tempData[j])
				{	
					sorted[m]=tempData[i];
					i++;
					m++;
				}
				else
				{
					sorted[m]=tempData[j];
					j++;
					m++;
				}
			}	
			
			if((i==mid+1)&&(j!=endnum+1))
			{
				for(int n=j;n<endnum+1;n++,m++)
					sorted[m]=tempData[n];
			}
			else if((i!=mid+1)&&(j==endnum+1))
			{
				for(int n=i;n<mid+1;n++,m++)
					sorted[m]=tempData[n];
			}
			
			for(int n=startnum;n<=endnum;n++)
			{
				tempData[n]=sorted[n];
			}
		}
	}

}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值