当前位置: 首页 > news >正文

【算法学习】归并算法Merge Sort总结

归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

1. 基本思想

归并排序使用分治思想,分治模式下每一层递归有三个步骤:

  • 分解(divide):将n个元素分成两个含n/2个元素的子序列
  • 解决(conquer):用合并排序法对两个子序列递归的排序
  • 合并(combine):直接合并两个已排序好的子序列

在这里插入图片描述
解释:上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。

2. 时间复杂度

归并排序中最主要的操作就是将两个有序序列合并,该操作的算法复杂度对归并排序的算法复杂度影响最大。
在这里插入图片描述

算得,时间复杂度为 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)

3. 算法实现

它的思路是先将数组分成两个子数组,然后分别对两个子数组进行归并排序,最后将两个有序的子数组合并成一个有序的数组。在合并的过程中,使用一个临时数组reg来存储合并后的结果,最后再将结果复制回原数组arr中。

#define N 100
int arr[N],reg[N];
void merge_sort(int l,int r){if(l>=r) return;int mid=(l+r)/2;int i=l,j=mid+1; //两个指针,分别指向分治后的两个子数列int k=l; //用于更新临时数组reg内的值//分治merge_sort(l,mid);merge_sort(mid+1,r);//合并while(i<=mid && j<=r){if(arr[i]<=arr[j]) reg[k++]=arr[i++];else reg[k++]=arr[j++] ;}while(i<=mid) reg[k++]=arr[i++];while(j<=r) reg[k++]=arr[j++];for(int k=l;k<=r;k++)arr[k]=reg[k];}
http://www.lryc.cn/news/198874.html

相关文章:

  • Swager如何使用
  • DHorse v1.4.2 发布,基于 k8s 的发布平台
  • Java使用JJWT令牌
  • “第四十四天”
  • Unity Mono和.Net平台浮点算法的区别
  • 【SA8295P 源码分析 (二)】64 - QNX 与 Android GVM 显示 Dump 图片方法汇总
  • shell命令以及运行原理和lLinux权限
  • 斯坦福JSKarel编程机器人使用介绍
  • SpringBoot中pom.xml不引入依赖, 怎么使用parent父项目的依赖
  • 基于vue3+ts5+vue-router4+pinia2的PC端项目搭建教程
  • 6个无版权、免费、高清图片素材库
  • 什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的 IE?
  • LeetCode 2906. 构造乘积矩阵【前后缀分解,数组】中等
  • vue3+koa+axios实现前后端通信
  • Required MultipartFile parameter ‘file‘ is not present
  • vue3后台管理系统之layout组件的搭建
  • Minio 文件上传(后端处理同文件判断,同一文件秒传)
  • 模拟IIC通讯协议(stm32)(硬件iic后面在补)
  • 使用注解读取properties配置文件
  • Python---练习:求世界杯小组赛的总成绩(涉及:布尔类型转换为整型)
  • vue3学习源码笔记(小白入门系列)------KeepAlive 原理
  • 边写代码边学习之mlflow
  • 基于吉萨金字塔建造优化的BP神经网络(分类应用) - 附代码
  • axios的post请求所有传参方式
  • 【c++】向webrtc学比较2: IsNewerSequenceNumber 用于NackTracker及测试
  • PRCV 2023:语言模型与视觉生态如何协同?合合信息瞄准“多模态”技术
  • 深度学习硬件配置推荐(kaggle学习)
  • 1019hw
  • 两分钟搞懂UiAutomator自动化测试框架
  • Fast DDS之Subscriber