归并排序算法与实现

题目描述

编写一个程序,使用分治策略实现二路归并排序(升序)。

输入

多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。

输出

输出排序之后(升序)的一维整型数组,每组输出占一行。

样例输入

6 1 8 6 5 3 4
5 12 42 2 5 8

样例输出

1 3 4 5 6 8
2 5 8 12 42
import java.util.Scanner;

public class Main {
	public static void Divide(int a[],int s,int t) {
		if(s<t) {
			//进行分区,递归分区,直到分成每一个都是有序,即只有一个
			int m = (s+t)/2;
			Divide(a, s, m);
			Divide(a, m+1, t);
			Merge(a,s,m,t);
		}
	}
	
	public static void Merge(int a[],int s,int m,int t) {
		//定义一个新数组来放置排序好的数据
		int b[] = new int[t-s+1];
		int i=s,j=m+1,k=0;
		while(i<=m&&j<=t) {
			//哪个数据小哪个数据就放入数组
			if(a[i]<=a[j])
				b[k++] = a[i++];
			else
				b[k++] = a[j++];
		}
		//第一个数组剩下的数据放入数组
		while(i<=m)
			b[k++] = a[i++];
		//第二个数组剩下的数据放入数组
		while(j<=t)
			b[k++] = a[j++];
		//将排序好的数组放回原数组中,原数组开头为s
		for(int x=0;x<b.length;x++)
			a[x+s] = b[x];
	}
	
	
	public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       while(sc.hasNext()) {
    	   //输入需要排序的数据
    	   int n = sc.nextInt();
    	   int a[] = new int[n];
    	   for(int i=0;i<n;i++) {
    		   a[i] = sc.nextInt();
    	   }
    	   Divide(a, 0, n-1);
    	   //调用函数排序
    	   for(int i=0;i<n;i++) {
    		   System.out.print(a[i]+" ");
    	   }
    	   //输出排序好的数据
       }
       sc.close();
    }
}
发布了12 篇原创文章 · 获赞 1 · 访问量 230

猜你喜欢

转载自blog.csdn.net/qq_46546793/article/details/105000698