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;
        }
    
    }
    

      

     参考资料

    • 《维基百科》
  • 相关阅读:
    java移位运算符详解[转]
    Android四大基本组件介绍与生命周期
    oracle中怎么得到日期相减除去周末后的天数
    小计_合计_统计
    Oracle--SQL技巧之一(查询连续的记录)
    游戏中地图的制作(一)
    在别的地方看的<<给程序员介绍一些C++开源库>>,记录给大家共同学习
    C语言调用python代码
    XML文件中怎么写小于号 等特殊符号
    system->copy 和 ShellExecute 用法
  • 原文地址:https://www.cnblogs.com/MrSaver/p/5947690.html
Copyright © 2011-2022 走看看