题目:排序
输入:
3 0 7 4
10 3 4 -9 0 4 5 4 2 9 23
输出:
3 0 7 4
10 3 4 -9 0 4 5 4 2 9 23
归并排序算法是将相邻的两个排序子序列合并成一个排序子序列,分治策略.
(1)递推法:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
int n=cin.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++){
a[i]=cin.nextInt();
}
mergeSort(a);
}
}
//一次归并
public static void merge(int []x,int []y,int b1,int b2,int n){
int i=b1,j=b2,k=b1;
while(i<b1+n&&j<b2+n&&j<x.length){
if(x[i]<=x[j])
y[k++]=x[i++];
else
y[k++]=x[j++];
}
while(i<b1+n&&i<x.length)
y[k++]=x[i++];
while(j<b2+n&&j<x.length)
y[k++]=x[j++];
}
//一趟归并
public static void mergepass(int x[],int y[],int n){
for(int i=0;i<x.length;i+=2*n){
merge(x,y,i,i+n,n);
}
}
//归并排序
public static void mergeSort(int []x){
int []y=new int[x.length];
int n=1;
//一次循环进行两次一趟归并,目的是将y复制到x中
while(n<x.length){
mergepass(x,y,n);
n*=2;
if(n<x.length){
mergepass(y,x,n);
n*=2;
}
}
for(int i=0;i<x.length-1;i++){
System.out.print(x[i]+" ");
}
System.out.println(x[x.length-1]);
}
}
(2)递归法
import java.util.Scanner;
public class Main {
static int x[];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
while(cin.hasNext()){
int n=cin.nextInt();
x=new int[n];
for(int i=0;i<n;i++){
x[i]=cin.nextInt();
}
mergeDg(x,0,n-1);
for(int i=0;i<x.length-1;i++){
System.out.print(x[i]+" ");
}
System.out.println(x[x.length-1]);
}
}
//一次归并
public static void merge(int []x,int []y,int begin,int end,int n){
int i=begin,j=n+1,k=begin;
while(i<1+n&&j<=end&&j<x.length){
if(x[i]<=x[j])
y[k++]=x[i++];
else
y[k++]=x[j++];
}
while(i<n+1&&i<x.length)
y[k++]=x[i++];
while(j<=end&&j<x.length)
y[k++]=x[j++];
//将y复制到x
for(int h=begin;h<=end;h++) {
x[h]=y[h];
}
}
//归并排序-----递归
//二分法思路
public static void mergeDg(int []x,int begin,int end){
if(begin<end) {
int []y=new int[x.length];
int m=(begin+end)/2;
mergeDg(x,begin,m);
mergeDg(x,m+1,end);
merge(x,y,begin,end,m);
}
}
}