归并排序java实现

public static void main(String[] args) {
        int arr[]={2,4,6,8,14,1,3,5,9,11};
        merge(arr, 0, arr.length-1);
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }
    
    //递归排序,分治法,自顶向下,递归分割数组,最终归并
    public static void merge(int [] arr,int start,int end){
        int mid=(start+end)/2;
        if(start<end){
            merge(arr, start, mid); //递归对arr[start...mid]排序
            merge(arr, mid+1, end);//递归对arr[mid+1...end]排序
            doMerge(arr,start,mid,end);//组合,将两个有序合并为一个有序区
        }
    }

    //组合,归并
    private static void doMerge(int[] arr, int start, int mid, int end) {
        int temp[]=new int[end-start+1];
        int tempIndex=0;
        int index=start;
        int right=mid+1;
        //两个子序列进行比较,小的放入临时数组
        while(index<=mid&&right<=end){
            if(arr[index]<=arr[right]){
                temp[tempIndex++]=arr[index++];
            }else{
                temp[tempIndex++]=arr[right++];
            }
        }
        //将左边剩下的元素加入到临时数组
        while(index<=mid){
            temp[tempIndex++]=arr[index++];
        }
        //将右边剩下的元素加入到临时数组
        while(right<=end){
            temp[tempIndex++]=arr[right++];
        }
        //复制临时数据到arrr[]数组中
        for(int i=0;i<temp.length;i++){
            arr[i+start]=temp[i];
        }
    }

 

posted @ 2016-12-08 21:54  吊儿郎当地正经着  阅读(258)  评论(0编辑  收藏  举报