归并排序

public class RecursiveMergeSort {

    public static void main(String[] args) {  
        int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };  
        print(data,"init");  
// sort(data); 
        mergeSort_insert(data, 0, data.length-1, 3);


    }  


    public static void sort(int []array){
        mergeSort(array, 0, array.length-1);
    }

    /** * * 合并排序 .<br> * void */
    public static void merge(int []array,int left,int center,int right){
        int []temp = new int[array.length];

        //缓存左侧数组第一个元素下标
        int tmp=left;
        //右侧数组第一个元素下标 
        int middle=center+1;
        //临时数组第一个元素下标
        int index=left;
        while(left<=center && middle<=right){
            if(array[left]<array[middle]){
                temp[index++]=array[left++];
            }else{
                temp[index++]=array[middle++];
            }
        }

        while(left<=center){
            temp[index++]=array[left++];
        }
        while(middle<=right){
            temp[index++]=array[middle++];
        }

        while(tmp<=right){
            array[tmp]=temp[tmp++];
        }

        print(array,"merge");
    }

    /** * * 分解排序 .<br> * * @param a * @param b * @param p * @param q void */
    public static void mergeSort(int []array,int left,int right){
        if(left >= right)
            return;

        int center = (left+right)/2;

        mergeSort(array,left,center);

        mergeSort(array,center+1,right);

        merge(array,left,center,right);
    }


    public static void mergeSort_insert(int []array,int left,int right,int k){
        if(left >= right)
            return;
        int center = (left+right)/2;
        if(right-left+1>k){
            mergeSort_insert(array,left,center,k);
            mergeSort_insert(array,center+1,right,k);
            merge(array, left,center,right);
        }else{
            insert_sort(array,left,right);
            print(array,"insert"); 
        }
    }

    public static void insert_sort(int []array,int left,int right){
        for(int i=left+1 ;i<=right;i++){
            int temp=array[i];
            int j=i-1;
            while(j>=left && array[j]>array[i]){
                array[i] = array[j];
                j--;
            }
            array[++j] = temp;
        }
    }

    public static void print(int[] data,String type) {
        System.out.print(type+"\t");
        for (int i = 0; i < data.length; i++) {  
            System.out.print(data[i] + "\t");  
        }  
        System.out.println();  
    }  
}
点赞