【十大排序算法】归并排序

ilqr算法原理推导及代码实践 ilqr算法原理详解 阅读详情

归并排序,如同秋日落叶,分散而细碎,
然而风吹叶动,自然而有序,
彼此相遇,轻轻合拢,
最终成就,秩序之谧。

一、归并排序

归并排序是一种基于分治思想的排序算法,它将一个待排序的数组分为两个子数组,然后对每个子数组递归地应用归并排序,直到子数组长度为 1。然后,将两个有序的子数组合并成一个有序的数组。这一过程重复进行,直到所有子数组合并成为一个有序的数组。

具体来说,归并排序的步骤如下:

  1. 分割: 将待排序数组分为两个子数组,通常是平均分割。
  2. 递归排序: 对两个子数组分别递归地应用归并排序,直到子数组长度为 1。
  3. 合并: 将两个有序的子数组合并成一个有序的数组。合并过程中,比较两个子数组的第一个元素,将较小(或较大)的元素添加到结果数组中,并将对应子数组的指针向后移动。
  4. 重复: 重复以上步骤,直到所有子数组合并成为一个有序的数组。

二、发展历史

归并排序是一种经典的排序算法,其发展历史可以追溯到 20 20 20 世纪 50 50 50 年代初期。

  1. 起源: 归并排序最早由约翰·冯·诺伊曼(John von Neumann)在 1945 1945 1945 年提出,并在他的著作《First Draft of a Report on the EDVAC》中描述了这一算法的基本原理。然而,彼时的计算机硬件水平并不足以支持归并排序的高效实现。
  2. 1960 年代: 归并排序在 1960 1960 1960 年代得到了更多的关注和研究。此时,归并排序成为了一种重要的外部排序算法,被应用于磁带排序和数据库系统等领域。在这一时期,归并排序的理论基础逐渐完善,并开始被广泛应用于实际系统中。
  3. 1980 年代: 随着计算机硬件的发展和算法研究的深入,归并排序得到了进一步的优化和改进。在 1980 1980 1980 年代,出现了一些新的归并排序的变种和优化算法,例如外部归并排序(External Merge Sort)和自然归并排序(Natural Merge Sort)等。
  4. 现代: 在当今计算机科学领域,归并排序仍然是一种非常重要和常用的排序算法。它的理论基础已经得到了深入研究和理解,并且在实际应用中得到了广泛的应用。虽然归并排序的时间复杂度较高,但其稳定性和可预测性使得它在某些场景下具有优势,特别是在外部排序和大规模数据处理等领域。

三、处理流程

场景假设:我们需要将下面的无序序列使用归并排序按从小到大进行排序。
workspace (1).png
归并排序的流程如下:

  1. 递归分割序列

workspace.png

  1. 递归合并序列并排序

workspace (2).png

四、算法实现

// 合并两个子数组
void merge(int[] array, int left, int mid, int right) {
    // 计算左右子数组的长度
    int leftLength = mid - left + 1;
    int rightLength = right - mid;

    // 创建临时数组存储左右子数组
    int[] leftArray = new int[leftLength];
    int[] rightArray = new int[rightLength];

    // 将数据拷贝到临时数组
    System.arraycopy(array, left, leftArray, 0, leftLength);
    System.arraycopy(array, mid + 1, rightArray, 0, rightLength);

    int i = 0, j = 0;
    int k = left;
    // 合并两个子数组
    while (i < leftLength && j < rightLength) {
        if (leftArray[i] <= rightArray[j]) {
            array[k++] = leftArray[i++];
        } else {
            array[k++] = rightArray[j++];
        }
    }

    // 处理剩余元素
    while (i < leftLength) {
        array[k++] = leftArray[i++];
    }

    while (j < rightLength) {
        array[k++] = rightArray[j++];
    }
}

// 递归地进行归并排序
void mergeSort(int[] array, int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        // 递归地对左右子数组进行归并排序
        mergeSort(array, left, mid);
        mergeSort(array, mid + 1, right);
        // 合并左右子数组
        merge(array, left, mid, right);
    }
}

public static void main(String args[]) {
    int[] array = {12, 11, 13, 5, 6, 7};
    System.out.println("原始数组:");
    for (int num : array) {
        System.out.print(num + " ");
    }
    System.out.println();

    // 调用归并排序算法
    mergeSort(array, 0, array.length - 1);

    System.out.println("\n排序后的数组:");
    for (int num : array) {
        System.out.print(num + " ");
    }
}

算法时间复杂度分析:

情况时间复杂度计算公式公式解释
最好情况 O ( n l o g n ) O(nlogn) O(nlogn) T ( n ) = 2 T ( n 2 ) + n T(n) = 2T(\frac{n}{2}) + n T(n)=2T(2n​)+n归并排序在所有情况下都会将数组分成两半,然后递归地对它们进行排序,最后再将它们合并。这个过程的时间复杂度始终为 O ( n l o g n ) O(nlogn) O(nlogn)。其中, n n n 是数组的长度, l o g n logn logn 是因为每次都将数组分成两半。
平均情况 O ( n l o g n ) O(nlogn) O(nlogn) T ( n ) = 2 T ( n 2 ) + n T(n) = 2T(\frac{n}{2}) + n T(n)=2T(2n​)+n同上
最坏情况 O ( n l o g n ) O(nlogn) O(nlogn) T ( n ) = 2 T ( n 2 ) + n T(n) = 2T(\frac{n}{2}) + n T(n)=2T(2n​)+n同上

五、算法特性

归并排序是一种经典的排序算法,具有以下特性:

  1. 稳定性: 归并排序是一种稳定的排序算法,即相同元素的相对位置在排序前后不会改变。这意味着如果有相同元素存在,它们在排序后的顺序与排序前相同。
  2. 原地性: 归并排序通常不是一种原地排序算法,因为它需要额外的空间来存储临时数组。
  3. 适用性: 归并排序适用于各种数据类型和应用场景。由于其稳定性和时间复杂度的优势,归并排序被广泛应用于实际场景中,例如排序库、数据库索引等。
  4. 递归性: 归并排序是一种递归算法,它通过将数组分割成两个子数组,然后对每个子数组递归地应用归并排序来实现排序。这种递归性质使得归并排序的实现相对简单。

六、小结

归并排序是一种稳定、高效的排序算法,适用于各种数据类型和应用场景。其原理简单、实现直观,并且具有良好的性能表现,因此是排序算法中的重要一员。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await
AXI2APB_bridge 设计 此处研究AHB Slave到 APB master的桥接器,实现接口转化,例如下图之后是参数描述 阅读详情

相关推荐

基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统

增加了模型的绑定,利用Mediapipe这个强大的库可以实现识别面部表情的捕捉和人体结构运动的捕捉,基于以上的特性加入到Unity的人物模型中,实现实时的面部表情和人体运行的捕捉

BIgbossyii的博客 1万+

数组排序之归并排序

归并排序(Merge Sort)是数组排序算法中一种常见的算法,其主要思想为经典的“分治思想”。本文将介绍数组排序算法中的归并排序,并介绍其相关应用。

山阴少年 2487

以TMS320F28069为例,如何使用CCS建立DSP工程文件

以TMS320F28069为例,本文主要介绍了使用CCS建立DSP工程的流程

Honglong 2556

归并排序(看了就会)

归并排序,是创建在归并操作上的一种有效的排序算法。上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。不管元素在什么情况下都要做这些步骤,所以花销的时间是不变的,所以该算法的最优时间复杂度和最差时间复杂度及平均时间复杂度都是一样的为:O( nlogn )归并排序算法中,归并最后到底都是相邻元素之间的比较交换,并不会发生相同元素的相对位置发生变化,故是稳定性算法。

Circ 2万+

告别反复刷写:用英飞凌XCP Overlay功能实现ECU标定与诊断的‘热更新’

本文详细介绍了英飞凌XCP Overlay功能在ECU标定与诊断中的应用,实现参数的'热更新',避免反复刷写Flash。通过地址重映射技术,将标定变量从Flash重定向到RAM,显著提升工作效率并保护Flash寿命。文章涵盖技术原理、工程实践、功能安全考量及高级应用场景,为汽车电子工程师提供完整解决方案。

weixin_30689307的博客 533

全志T133-s3(Tina Linux)下RTL8723DS WiFi驱动移植与调试实战

本文详细介绍了在全志T133-s3平台(Tina Linux)上移植RTL8723DS WiFi驱动的完整流程,包括硬件连接、驱动源码获取、内核配置、系统适配、设备树配置以及常见问题排查。通过实战案例,帮助开发者快速解决SDIO接口通信、固件加载、电源管理等关键问题,实现稳定的WiFi功能。

weixin_30505225的博客 507

八大排序算法之归并排序(递归实现+非递归实现)

归并排序(递归实现+非递归实现)

小青菜的博客 1万+

Unreal Engine开发:多人联机与网络同步_延迟补偿与预测

通过延迟补偿和预测技术,我们可以显著减少网络延迟对多人在线动作游戏的影响,提升玩家的体验。延迟补偿主要在服务器端实现,通过回溯时间点来更准确地处理输入和事件。预测技术主要在客户端实现,通过预先计算玩家的动作结果来减少延迟感。结合这两种技术,可以实现更平滑、更公平的多人游戏体验。

chenlz2007的博客 1191

数组排序算法——归并排序(Merge)算法精讲及python实现

归并排序算法的时间复杂度等于归并趟数与每一趟归并的时间复杂度乘积。的时间复杂度是 $O(n)$,因此,归并排序算法总的时间复杂度为 $O(n \times \log_2 n)$。归并排序方法需要用到与参加排序的序列同样大小的辅助空间。然后将有序序列两两合并,最终合并成一个有序序列。比较两个指针指向的元素,将两个有序子序列中较小元素依次存入到结果数组。因为在两个有序子序列的归并过程中,如果两个有序序列中出现相同元素,的有序子序列开始,依次进行两两归并,直到合并成一个长度为。的有序序列,排序结束。

白话机器学习 647

新手必看:C#调用YOLO模型完成图片/视频目标检测(上位机版)

新手学习C#调用YOLO模型,核心是先把基础流程跑通,再逐步优化。图片检测是基础,视频检测就是在图片的基础上加循环和线程,而上位机的实际项目,就是在这个基础上适配工业硬件和业务需求。本文的代码都是新手能直接复制运行的,如果你运行时遇到问题,先检查前期准备是否到位,再看避坑指南。记住,新手别追求一步到位,先实现功能,再慢慢优化性能和界面。等你能熟练调用YOLO模型后,再去研究模型训练、量化优化等进阶内容,会轻松很多。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 988

Yolo11改进:Block改进|MixDehazeNet,用于图像去雾网络的混合结构块|即插即用|附代码

https://arxiv.org/pdf/2305.17654 图像去雾是低级视觉领域中的一项典型任务。先前的研究验证了大型卷积核和注意力机制在去雾中的有效性。然而,存在两个缺点:引入大型卷积核时容易忽略图像的多尺度特性,而注意力模块的标准串联方式没有充分考虑雾分布的不均匀性。在本文中,我们提出了一种名为混合结构图像去雾网络(MixDehazeNet)的新型框架,该框架解决了上述两个问题。具体而言,它主要由两部分组成:多尺度并行大型卷积核模块和增强并行注意力模块。与单个大型卷积核相比,多尺度的并行大型卷积

m0_47867638的博客 1275

排序之归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。所谓归并,就是将两组有序的数据合成为一组有序的数据,例如有如下两个有序数组,将两个有序数组归并为一个有序数组,这就是一次归并操作。

dong132697的博客 2万+

基于树莓派4B与NCNN的YOLOv8高效部署实战:无GPU环境下的C++加速优化全流程指南**

本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的全流程。内容包括:从PyTorch模型导出NCNN格式文件、树莓派环境配置(OpenCV和NCNN编译)、C++实现代码解析(含模型加载、推理及后处理),以及实际部署测试结果。在树莓派4B上达到约2FPS,并提供INT8量化、多线程等优化建议。该方案为无GPU设备提供了轻量化目标检测的实用部署方案,适合边缘计算场景。

FJN110的博客 917

十大排序算法之归并排序

排序是重要又较为简单的算法之一,个人认为学习算法建议先学习排序,排序有十种重要的排序方法,有些好,有些坏。‌归并排序是一种高效的排序算法,基于分治策略,通过递归分解和合并操作实现排序。其核心思想是将一个数组分成若干个子数组,分别对每个子数组进行排序,然后将已排序的子数组合并成一个完整的排序数组。

NOIP1ding_c的博客 779

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【C++】十大排序算法之 归并排序 & 快速排序

排序算法是《数据结构与算法》中最基本的算法之一。

K1_uestc的博客 2006

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

十大经典排序算法总结(归并排序)

写在前面 楼主整理经典的排序算法 记录学习 十大经典排序算法总结(冒泡排序) 文章目录1. 归并排序(MergeSort)1.1 概念1.2 算法描述1.3 代码演示1.4 算法分析1.5 适用场景 1. 归并排序(MergeSort) 1.1 概念 归并排序利用的是分治的思想实现的,对于给定的一组数据,利用递归与分治技术将数据序列划分成为越来越小的子序列,之后对子序列排序,最后再用递归方法将排好序的子序列合并成为有序序列。合并两个子序列时,需要申请两个子序列加起来长度的内存,临时存储新的生成序列,再将

康小庄的博客 531

【千锤百炼Python—9】:十大排序算法之归并排序

归并排序是排序算法系列的第七个要介绍的算法! 归并排序既属于**比较类排一、算法原理 1. 算法原理 归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并排序的二路归并排序方式: 二路归并:将待排序列分成两个长度相等的子序列,然后对每个子序列进行排序,然后将排序好的子序列合并成一个完整序列。 归并排序是排序算法系列的第七个要介绍的算法! 归并排序既属于**比较类排序**也属于**内部排序**。

王乐予的博客 2457

【十大排序算法】(七)归并排序算法

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

2401_84048521的博客 504

十大经典排序算法-归并排序算法详解

一、什么是归并排序 1.概念 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的 2.算法原理 这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分 序列逐层拆分如下 然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并 创建一个大序列,序列长度为两个小序列长度

qq_35344198的博客 12万+

十大排序算法之一——归并排序以及优化

本文详细讲解归并排序(含图解)以及系列的优化(附有递归和非递归的实现),以及c++中stable_sort函数的使用

2403_87685439的博客 1272

十大经典排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序)

例如对于含有 n 个记录的无序表,首先默认表中每个记录各为一个有序表(只不过表的长度都为 1),然后进行两两合并,使 n 个有序表变为 ⌈n/2⌉ 个长度为 2 或者 1 的有序表(例如 4 个小有序表合并为 2 个大的有序表),通过不断地进行两两合并,直到得到一个长度为 n 的有序表为止。这种归并排序方法称为:2-路归并排序。本节介绍一种不同于插入排序和选择排序的排序方法——归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表。.....

weixin_59803490的博客 1969

十大排序算法——归并排序

目录 归并排序原理 归并排序API设计 归并排序代码实现 归并排序的时间复杂度分析 归并排序是采用分治法的一个非常典型的应用。先使每个子序列有序,再使子序列段间有序,也就是将已有的子序列合并,得到完全有序的序列;如果将两个有序表合并成一个有序表,称为二路归并。 归并排序原理 1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。 ⒉将相邻的两个子组进行合并成一个有序的大组。 3.不断的重复步骤2,直到最终只有一个组为止。 归并排序API

龍弟-idea的博客 3732

归并排序执行次数_十大经典排序算法(动图演示)

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达 作者|修罗神·唐三来源 | urlify.cn/bMfUnu66套java从入门到精通实战课程分享0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次...

weixin_39616090的博客 1464
上一篇: 【设计模式】结构型-桥接模式
下一篇: 【十大排序算法】堆排序
知行小栈
博客等级 码龄9年 2506粉丝 153原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值