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]
    
  • 相关阅读:
    关于分布式事务、两阶段提交协议、三阶提交协议
    关于分布式一致性的探究
    初始分布式系统
    移动端禁止video在ios系统中自动全屏播放
    ios对new Date() 的兼容问题
    VUE路由懒加载的方式
    记录 好看的阴影
    创建码云仓库,并将本地代码上传至仓库
    v-cloak遇到的问题及解决方法
    CSS 定义一条渐变优雅的分割线
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8059996.html
Copyright © 2011-2022 走看看