package com.cn.gao;
//归并排序算法设计
public class MergeSort {
public static final int SIZE=15;
/**
* 合并一次算法
* @param a 原数组
* @param b 合并后存放数据数组
* @param n 数组a中元素个数
* @param len 有序元素的长度
*/
public static void mergeOne(int[] a,int[] b,int n,int len){
int i,j,k,l,m;
i=0;
while(i+len<n){
j=i+2*len-1;
if(j>=n){ //最后一段可能少于len个元素
j=n-1;
}
m=i;
k=i;
l=i+len;
//合并相邻有序段
while(i<k+len&&l<=j){
if(a[i]<=a[l]){
b[m++]=a[i++];
}else{
b[m++]=a[l++];
}
}
//将未合并的部分复制到数组b中
while(i<k+len){
b[m++]=a[i++];
}
while(l<=j){
b[m++]=a[l++];
}
i=j+1; //下一对有序段左段的开始下标
}
//将剩余的有序段加入b中
if(i<n){
for(;i<n;i++){
b[i]=a[i];
}
}
}
/**
* 最终合并算法
* @param a 原始数组
* @param n 数组元素个数
*/
public static void mergeSort(int a[], int n){
int [] b = new int[n];
int len=1,flag=0,count=0;
while(len<n){
if(flag==0){
mergeOne(a,b,n,len); //合并到b中
}
if(flag==1){
mergeOne(b,a,n,len); //合并到a中
}
flag=1-flag;
len=2*len;
count++;
//输出每趟归并后的结果
System.out.print("第"+count+"次排序的结果为:");
for(int i=0;i<n;i++){
System.out.print(" "+(flag==0?a[i]:b[i]));
}
System.out.println();
}
if(flag==1){ //如果最后一步合并到b中
for(int i=0;i<n;i++){
a[i]=b[i];
}
}
}
public static void main(String[] args) {
int[] a = new int[SIZE];
//为数组赋值
for(int i=0;i<a.length;i++){
a[i] = (int) (100 + Math.random()*100);
}
//输出排序前的数组
System.out.println("排序前的数组为:");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
//对数组排序
mergeSort(a,SIZE);
//输出排序后的数组
System.out.println("排序后的数组为:");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
}