zoukankan      html  css  js  c++  java
  • 经典排序之归并排序

    归并排序(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]
    
  • 相关阅读:
    [JZOJ3386] 守卫者的挑战
    [JZOJ3385] 黑魔法师之门
    [JZOJ3383] 太鼓达人
    [JZOJ3382] 七夕祭
    NOIP模拟测试on 2019.9.27
    数据结构测试2 on 2019.9.25
    数据结构测试1 on 2019.9.24
    P2047 [NOI2007]社交网络
    P2286 [HNOI2004]宠物收养场
    P1342 请柬 建反图+dijkstra
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8059996.html
Copyright © 2011-2022 走看看