zoukankan      html  css  js  c++  java
  • 算法:归并排序

    算法:归并排序

    归并排序

    归并操作

      归并排序也是一种高级排序算法,它的主要操作就是归并。归并是什么意思呢?

    归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

      举个简单例子,我们之前有讲合并有序链表或是数组,这就是一种归并,简单理解就是将两个有序序列进行合并!  

      

      那这样说来,归并操作的代码别说你并不会☺️!

    谈到排序

      谈到排序,说明给定的序列肯定并不是有序的,我们要做的就是将它有序化。如果我们直接将一个无序序列中间腰斩,他就会有两个序列了,

      

      但此时来说,左右序列都是无序的,是没办法进行归并操作,那我们接着对左右两边再腰斩

      

      直到左右两个序列长度为1,此时就是有序的!别问我为什么,长度为1 当然是有序啦!这个时候就可以进行归并操作了!

      

      归并后就组成了长度为2的有序序列,根基现在是有序的,那我们按照之前划分的顺序逆向归并,就组成了一个有序数组

      

      这就是归并操作的完整流程了,此时就可以按照思路写代码了!

    Java实现

      代码是我纯手撸的,可能并不是最优解,但是我觉得思路搞懂了,写个代码还是简单的!

    package sort;
    
    import java.util.Arrays;
    
    /**
     * 归并排序
     * @author mrsaber
     */
    public class MergeSort {
    
        public static void main(String[] args) {
            System.out.println(Arrays.toString(new MergeSort().sort(new int[]{1,5,3,2,4,8,9,2,1})));
        }
    
    
        public int[] sort(int[] nums){
            if(nums.length==1)
                return nums;
            int mid = nums.length/2;
            int[] leftNums = sort(Arrays.copyOfRange(nums,0,mid));
            int[] rightNums =sort(Arrays.copyOfRange(nums,mid,nums.length));
            return merge(leftNums,rightNums);
        }
    
    
        /**
         * 合并操作
         * @param leftNums
         * @param rightNums
         */
        public int[] merge(int[] leftNums,int[] rightNums){
            int[] result = new int[leftNums.length+rightNums.length];
            int i=0,j=0,p=0;
            while (i<leftNums.length&&j<rightNums.length){
                if(leftNums[i]<rightNums[j]){
                    result[p] = leftNums[i];
                    i++;
                }else{
                    result[p] = rightNums[j];
                    j++;
                }
                p++;
            }
            while (i<leftNums.length)
                result[p++]=leftNums[i++];
            while (j<rightNums.length)
                result[p++]=rightNums[j++];
            return result;
        }
    
    }
    

      

     参考资料

    • 《维基百科》
  • 相关阅读:
    逆元应用求组合数
    树的重心入门
    扫描线求面积的并,交
    涂抹果酱
    牧场的安排
    「SCOI2005」互不侵犯
    Network Coverage
    Linux命令传输文件
    VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti
    Springboot开启SpringSecurity
  • 原文地址:https://www.cnblogs.com/MrSaver/p/5947690.html
Copyright © 2011-2022 走看看