经典排序之归并排序

归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,它将已有序的子序列合并,得到完全有序的序列。

归并排序的速度仅次于快速排序,时间复杂度为O(n*logn),为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

请看下述代码:

package 排序算法.归并排序;

import java.util.Arrays;

/**
 * 归并排序
 */
public class Test {
    static int num=0;//排序次数

    //排序前,先建好一个长度等于原数组的临时数组,避免递归中频繁开辟栈空间
    static void sort(int[] arr){
        int[] temp=new int[arr.length];
        sort(arr,0,arr.length-1,temp);
    }
    static void sort(int[] arr,int left,int right,int[] temp){
        if(left<right){
            int mid=(left+right)/2;
            sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
            sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
            merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
        }
    }
    static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i=left;//左序列指针
        int j=mid+1;//右序列指针
        int t=0;//临时数组指针
        while(i<=mid && j<=right){
            if(arr[i]<=arr[j]){
                temp[t]=arr[i];
                t++;
                i++;
            }else{
                temp[t]=arr[j];
                t++;
                j++;
            }
        }
        while (i<=mid){//将左边剩余元素填充进temp中
            temp[t]=arr[i];
            t++;
            i++;
        }
        while (j<=right){//将右序列剩余元素填充进temp中
            temp[t]=arr[j];
            t++;
            j++;
        }
        t=0;
        //将temp中的元素全部拷贝到原数组中
        while (left<=right){
            arr[left]=temp[t];
            left++;
            t++;
        }
        System.out.println("第"+(++num)+"次:"+ Arrays.toString(arr));
    }
    public static void main(String[] args) {
        int[] arr=new int[]{15,32,14,86,54,78,36};
        System.out.println("排序前:"+Arrays.toString(arr));
        sort(arr);
        System.out.println("排序后:"+Arrays.toString(arr));
    }
}

 上述代码的运行结果为:

排序前:[15, 32, 14, 86, 54, 78, 36]
第1次:[15, 32, 14, 86, 54, 78, 36]
第2次:[15, 32, 14, 86, 54, 78, 36]
第3次:[14, 15, 32, 86, 54, 78, 36]
第4次:[14, 15, 32, 86, 54, 78, 36]
第5次:[14, 15, 32, 86, 36, 54, 78]
第6次:[14, 15, 32, 36, 54, 78, 86]
排序后:[14, 15, 32, 36, 54, 78, 86]
posted @ 2017-12-18 22:16  奔跑在梦想的道路上  阅读(274)  评论(0编辑  收藏  举报