题目描述
编写一个程序,使用分治策略实现二路归并排序(升序)。
输入
多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。
输出
输出排序之后(升序)的一维整型数组,每组输出占一行。
样例输入
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();
}
}