文章目录

  • 小程一言
    • 归并排序
      • 步骤
      • 举例
        • 总结
        • 时间复杂度分析:
        • 空间复杂度分析:
        • 注意
      • 应用场景
        • 总结
      • 实际举例
        • Other
      • 代码实现
        • 结果
        • 解释

小程一言

这篇文章是在排序进行曲2.0之后的续讲,
这篇文章主要是对归并排序进行细致分析,以及操作。
希望大家多多支持

图片:

归并排序

归并排序是一种分治算法,它将一个待排序的数组分成两个子数组,分别对这两个子数组进行排序,然后再将
两个有序的子数组合并为一个有序的数组。这个过程不断地递归进行,直到最后将整个数组排序完成。

步骤

分割(Divide):将待排序的数组不断地二分,直到分成单个元素的子数组。这个过程可以通过递归实现。递归的终止条件是数组的长度为1。合并(Merge):将相邻的两个有序子数组合并为一个有序的子数组。合并的方法是比较两个子数组的第一个元素,将较小的元素放在新的子数组中,并将该元素从原子数组中移除。然后继续比较两个子数组的新的第一个元素,重复这个过程,直到其中一个子数组为空。将剩余的另一个子数组直接拼接到新的子数组的末尾。递归合并(Recursive Merge):对每个单个元素的子数组进行排序和合并。当子数组长度为1时,它已经是有序的,直接返回该子数组即可。对于长度大于1的子数组,先将其分割成两个子数组,然后分别对这两个子数组进行递归合并,得到两个有序的子数组。最后将这两个有序的子数组进行合并,得到一个更大的有序子数组。

举例

假设我们要对数组 [5, 3, 8, 2, 9, 1] 进行排序。分割(Divide):首先将数组分成两个子数组,即 [5, 3, 8] 和 [2, 9, 1]。递归合并(Recursive Merge):对两个子数组分别进行递归合并排序。首先对 [5, 3, 8] 进行递归合并排序,得到有序子数组 [3, 5, 8]。然后对 [2, 9, 1] 进行递归合并排序,得到有序子数组 [1, 2, 9]。合并(Merge):将两个有序子数组 [3, 5, 8] 和 [1, 2, 9] 进行合并。比较两个子数组的第一个元素,将较小的元素放入新的子数组中,并将该元素从原子数组中移除。依次比较,得到新的子数组[1, 2, 3, 5, 8, 9]。最终,整个数组 [5, 3, 8, 2, 9, 1] 经过归并排序后,得到有序数组 [1, 2, 3, 5, 8, 9]。

总结

这个例子展示了归并排序的过程,通过不断地分割和合并子数组,最终将整个数组排序。在每一次合并过程中,我们都是将两个有序的子数组合并为一个有序的子数组,这保证了最终得到的整个数组是有序的。


)### 复杂度分析

归并排序的时间复杂度为 O(nlogn),空间复杂度为 O(n)。

时间复杂度分析:


分割(Divide):每次将数组分割成两个子数组,分割的时间复杂度为 O(logn)。因为每次分割都将数组的大小减半,所以需要进行 logn 次分割。
合并(Merge):对于每一次合并操作,需要比较两个子数组的元素并将较小的元素放入新的子数组中,合并的时间复杂度为 O(n)。因为每次合并都是将两个子数组的元素全部比较一遍,所以需要进行 n 次合并。
递归合并(Recursive Merge):对于长度为 n 的数组,需要进行 logn 次递归合并,每次递归合并的时间复杂度为 O(n)。所以总的时间复杂度为 O(nlogn)。

空间复杂度分析:

在每次递归合并的过程中,需要创建临时数组来存储合并后的子数组,临时数组的空间复杂度为 O(n)。
在每次递归合并完成后,临时数组会被销毁,所以整个归并排序的空间复杂度为 O(n)。

注意

归并排序是一种稳定的排序算法,因为在合并的过程中,如果两个元素相等,我们会先将左边的元素放入新的子数组中,这样可以保持原始数组中相等元素的相对顺序不变。

应用场景

排序问题:归并排序可以用于对数组、链表等数据结构进行排序。它的时间复杂度为O(nlogn),在处理大规模数据集时表现较好。大规模数据的排序:归并排序适用于需要对大规模数据进行排序的场景。由于归并排序是一种分治算法,可以将大规模数据分割成较小的子问题进行排序,然后再将排序好的子问题合并起来。外部排序:归并排序是一种适用于外部排序的算法。外部排序是指需要处理的数据量大于计算机内存容量,需要将数据存储在外部存储介质(如硬盘)中进行排序。归并排序的特点是每次只需要读取一部分数据到内存中进行排序,然后将排序好的数据写回外部存储介质。并行计算:归并排序可以通过并行计算的方式提高排序的效率。由于归并排序的分治特性,可以将大规模数据分割成多个子问题进行排序,然后再将排序好的子问题合并起来。这种并行计算的方式可以利用多核处理器或分布式计算环境来加速排序过程。

总结

归并排序适用于排序问题,特别是大规模数据的排序和外部排序场景。它具有稳定的时间复杂度和较好的并行性能,因此在实际应用中被广泛使用。

实际举例

数组排序:归并排序可以用于对数组进行排序。例如,给定一个整数数组,可以使用归并排序将数组中的元素按照升序进行排序。链表排序:归并排序也可以用于对链表进行排序。例如,给定一个链表,可以使用归并排序将链表中的节点按照升序进行排序。文件排序:归并排序可以用于对大规模文件进行排序。例如,当需要对一个非常大的文件进行排序时,可以使用归并排序算法将文件分割成多个较小的部分,分别对这些部分进行排序,然后再将排序好的部分合并起来。数据库排序:归并排序可以用于对数据库中的数据进行排序。例如,在某个数据库表中有大量的数据需要按照某个字段进行排序,可以使用归并排序算法将数据分割成多个较小的部分,分别对这些部分进行排序,然后再将排序好的部分合并起来。外部排序:归并排序是一种适用于外部排序的算法。外部排序是指需要处理的数据量大于计算机内存容量,需要将数据存储在外部存储介质(如硬盘)中进行排序。归并排序的特点是每次只需要读取一部分数据到内存中进行排序,然后将排序好的数据写回外部存储介质。

Other
这些例子只是归并排序在实际中的一些应用,实际上归并排序的思想和方法也可以应用于其他问题,只需要将问题分割成更小的子问题,并将子问题的结果合并起来。

代码实现

public class MergeSort {public static void mergeSort(int[] arr) {if (arr == null || arr.length <= 1) {return;}int[] temp = new int[arr.length];mergeSort(arr, 0, arr.length - 1, temp);}private static void mergeSort(int[] arr, int start, int end, int[] temp) {if (start >= end) {return;}int mid = start + (end - start) / 2;mergeSort(arr, start, mid, temp);mergeSort(arr, mid + 1, end, temp);merge(arr, start, mid, end, temp);}private static void merge(int[] arr, int start, int mid, int end, int[] temp) {int left = start;int right = mid + 1;int index = start;while (left <= mid && right <= end) {if (arr[left] <= arr[right]) {temp[index++] = arr[left++];} else {temp[index++] = arr[right++];}}while (left <= mid) {temp[index++] = arr[left++];}while (right <= end) {temp[index++] = arr[right++];}for (int i = start; i <= end; i++) {arr[i] = temp[i];}}public static void main(String[] args) {int[] arr = {5, 2, 8, 4, 9, 1, 3, 7, 6};mergeSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}
}

结果

运行以上代码,输出结果为:Sorted array: [1, 2, 3, 4, 5, 6, 7, 8, 9],表示归并排序对给定的数组进行了升序排序。

解释

在mergeSort方法中,首先判断数组的长度是否小于等于1,如果是,则直接返回。然后创建一个临时数组temp,并调用mergeSort方法对数组进行递归排序。在mergeSort方法中,首先计算出数组的中间位置mid,然后分别对左半部分和右半部分进行递归排序,最后调用merge方法将排序好的左右两部分合并起来。在merge方法中,使用双指针分别指向左半部分和右半部分的起始位置,比较两个指针所指的元素大小,将较小的元素放入临时数组temp中,并将对应指针向后移动一位。最后将临时数组temp中的元素复制回原数组arr中,完成排序。

图片:

排序进行曲-v3.0相关推荐

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本强势发布

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chinahuyong/article/details/51290832 继上个版本"RDI ...

  2. 低代码平台,JeecgBoot v3.0版本发布—新里程牌开始,迎接VUE3版本到来

    项目介绍 JeecgBoot是一款基于代码生成器的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shi ...

  3. 【BMI指数计算器V3.0】项目实战

    [BMI指数计算器V3.0]项目实战震撼发布,欢迎前来交流~~~,如果是刚来的朋友可以先从 [BMI指数计算器V1.0]项目实战,[BMI指数计算器V2.0]项目实战开始,这样循序渐进更能感受到每一个 ...

  4. GOOGLE搜索从入门到精通v3.0 from:http://www.being.org.cn/tool/google.htm

    GOOGLE搜索从入门到精通v3.0 原文:http://www.lasg.ac.cn/docs/googlebook.html 作者:donquix 内容 1,前言 2,摘要 3,如何使用本文 4, ...

  5. 全国2400站点地面气候资料日值数据集(V3.0)数据说明与数据处理

    (1)中国地面气候资料日值数据集(V3.0)数据说明 "中国地面气候资料日值数据集(V3.0)"数据是按年-月存放的, 每年每月的所有站点数据每一项气象要素都放在一个文本文件中,全 ...

  6. 择云关键词查询工具2023 v3.0 正式发布了 (支持批量查询百度指数)

    这是一款能够批量挖掘大量关键词的工具,实时挖掘速度业界第一!!! 软件介绍: 择云关键词查询工具2023 V3.0是针对站长,企业营销人员,及SEO人士的一款的关键词快速挖掘工具,能够帮助用户快速查询 ...

  7. 支撑区块链大规模商用,FISCO BCOS v3.0的那些“黑科技”

    文章转载自CSDN公众号 在2021年度金链盟生态大会上,全新的FISCO BCOS v3.0正式发布.该版本从架构.算法以及安全可控和隐私计算协同等方向进行了全面升级,满足数字经济时代对区块链系统可 ...

  8. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

  9. 通用权限管理组件使用说明书V3.0 错误校正 感谢自由软件职业者Helper(767870484)...

    有时候,真想做个像样的东西出来,但是往往各方面的能力都不够,这么多人,Helper(767870484)仔细认真的阅读了这个帮助手册.并给给于了指正,在这里非常感谢,你的劳动成果已经被通用权限管理积累 ...

最新文章

  1. ApplicationContextAware 接口
  2. Java final关键字修饰变量Test
  3. iOS自定义转场动画实战讲解
  4. 20145201 《信息安全系统设计基础》课程总结
  5. android使用HttpURLConnection/HttpClient实现带参数文件上传
  6. OpenCV霍夫线圆HoughLinesCircles的实例(附完整代码)
  7. (收藏)Html相关网址
  8. 将物体固定在坐标某个点_坐标变换(2)—不同坐标系下的变换
  9. Make NTFS writable on macOS
  10. docker搭建mysql主从
  11. FPGA常用总线IIC 与SPI选择策略
  12. 为什么每个邮件收到后都会有一个htm的附件_Python3.x 发送各种形式的告警邮件内容...
  13. Atitit pg10分区 总结 1.1. create table tmp_log (  1 1.2. -创建索引 1 1.3. 查看表 in pgadmin4 2 2. 二 分区表管理 2 2.1
  14. 【SENCHA TOUCH】datepickerfield将日期改为中文日期或自定义的日期
  15. 中国柔性材料行业发展建议及竞争态势研究报告2021年版
  16. 知识图谱在教育行业的应用
  17. 判断DataTable中否存在指定列
  18. 二、VSCode——MiKTeX编写latex编码
  19. 基于51单片机的智能汽车雨刷控制系统方案原理图程序设计
  20. 基于多项式拟合的结构光系统标定

热门文章

  1. 中科院大牛博士是如何进行文献检索和阅读的(好习惯受益终生)【转】
  2. 五大常用办公软件-office办公软件
  3. 分组循环查询实现列转行
  4. 谈谈浏览器的缓存机制
  5. C++中count函数用法
  6. Windows CE嵌入式导航系统研究(内核相关)
  7. 我用ChatGPT写2023高考语文作文(六):北京卷II
  8. c/c++参考手册与手册查阅(apiref.com/Microsoft doc/cppReference/cplusplus)
  9. md-editor-v3拓展工具栏失效的问题
  10. FOJ有奖月赛-2016年8月(daxia专场之过四题方有奖)