归并排序算法

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();

    }

}
原文地址:https://www.cnblogs.com/gaopeng527/p/4482945.html