首页 > 编程语言 >十大排序算法之归并排序

十大排序算法之归并排序

时间:2023-04-23 10:35:42浏览次数:39  
标签:归并 end divide int begin middle 算法 array 排序


归并排序

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

算法步骤

  1. 不断地将当前序列平均分割成2个子序列,直到不能再分割(序列中只剩1个元素)
  2. 不断地将2个子序列合并成一个有序序列,直到最终只剩下1个有序序列

十大排序算法之归并排序_分治算法

divide实现

private E[] leftArray;

    @Override
    protected void sort() {
        this.leftArray = (E[]) new Comparable[array.length >> 1];
        divide(0, array.length);
    }

    /**
     * 对索引范围为[begin,end)的元素进行拆分
     * @param begin
     * @param end
     */
    private void divide(int begin, int end) {
        if(end - begin < 2) {
            return;
        }

        int middle = (begin + end) >> 1;
        divide(begin, middle);
        divide(middle, end);

        merge(begin, middle, end);
    }

merge实现

private void merge(int begin, int middle, int end) {

        int li = 0;
        int le = middle - begin;
        int ri = middle;
        int re = end;
        int ai = begin;

        // 先备份左边
        for (int i = li; i < le; i++) {
            leftArray[i] = array[begin + i];
        }

        while (li < le) {

            if(ri < re && cmp(leftArray[li], array[ri]) > 0) {
                array[ai++] = array[ri++];
            } else {
                array[ai++] = leftArray[li++];
            }
        }

    }

由于归并排序总是平均分割子序列,所以最好、最坏、平均时间复杂度都是O(nlogn),属于稳定排序。

从代码中不难看出:归并排序的空间复杂度是O(n/2+ logn)= O(n),其中n/2用于临时存放左侧数组,logn用于递归调用。

更多精彩内容关注本人公众号:架构师升级之路

十大排序算法之归并排序_算法_02


标签:归并,end,divide,int,begin,middle,算法,array,排序
From: https://blog.51cto.com/u_6784072/6216464

相关文章

  • 排序算法之希尔排序
    希尔排序1959年由唐纳德·希尔(DonaldShell)提出希尔排序。希尔排序的思想:把数组中的元素看作是一个矩阵,分成m列,逐列进行排序(一般采用插入排序),m从某个整数逐渐减为1,当m为1时,整个序列将完全有序。因此,希尔排序也被称为递减增量排序(DiminishingIncrementSort)。矩阵的列数取决于步长......
  • Redis、Memcached、Guava、Ehcache中的算法
    1.LRU简单粗暴的Redis今天看 Redis3.0的发行通告里说,LRU算法大幅提升了,就翻开源码来八卦一下,结果哭笑不得,这旧版的"近似LRU"算法,实在太简单,太偷懒,太Redis了。在 Github的Redis项目里搜索lru,找到代码在redis.c的freeMemoryIfNeeded()函数里。先看 2.6版的代码:竟然就是随机找三......
  • 代码随想录算法训练营第四天 | 24.两两交换链表
     ......
  • m基于WDM网络的波长分配算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:      2.算法涉及理论知识概要       波分复用WDM(WavelengthDivisionMultiplexing)是将两种或多种不同波长的光载波信号(携带各种信息)在发送端经复用器(亦称合波器,Multiplexer)汇合在一起,并耦合到光线路的同一......
  • #yyds干货盘点# LeetCode程序员面试金典:搜索旋转排序数组
    题目:整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处......
  • MATLAB图像倾斜校正算法实现:图像倾斜角检测及校正|附代码数据
    全文下载链接:http://tecdat.cn/?p=13981最近我们被客户要求撰写关于图像倾斜校正算法的研究报告,包括一些图形和统计输出。在本文中,随着多媒体技术的不断发展,数码相机,高清拍照手机等多媒体设备已经在人们的生活中占据了越来越重要的地位通过采用图像处理技术,可以将数码设备采集......
  • 算法学习day03链表part01-203、707、206--待办
    //这块需求重新进行学习packageLeetCode.linkedlistpart01;publicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)publicListNode(){}//节点的构造函数(有一个参数)publicLis......
  • 视觉SLAM:模型介绍、算法框架及应用场景
    目录01 什么是SLAM 1.1 相机模型1.2 相机运动1.3建图02SLAM算法框架03SLAM的应用场景3.1自动驾驶的高精度定位3.2自主移动机器人知识扩展:组合导航(GNSS/INS)二维码导航/磁导航3.3室内场景的三维重建:AR(增强现实技术)等04 结语参考文献:本文主要想使用尽量少的专业词汇来解释......
  • 常见算法Python实现
    一、算法与数据结构1、二叉树1.重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建如下图所示的二叉树并输出它的头节......
  • C++的拓扑排序实现
    template<typenameT=CString,typename_Data=CString> structUnion_node//!<节点 { Union_node():nColor(0){} std::vector<Union_node*>vecNodeSon; Tkey;//!<关键数据 _Datadata;//!<卫星数据 mutableintnColor;//0:白色节点(未发现),1:灰色节点(发现),......