排序算法(5):归并排序

news2024/12/16 16:55:49

问题

排序 [30, 24, 5, 58, 18, 36, 12, 42, 39]

归并排序

归并排序采用分治法,将序列分成若干子序列,每个子序列有序后再合并成有序的完整序列。

在数组排序中,如果只有一个数,那么它本身就是有序的。如果有两个数,只需要进行一次比较就可以完成排序。也就是说,数越少,排序越容易。那么,如果有一个由大量数据组成的序列,可以考虑将其不断分解,直到只剩一个数时,本身已经有序,再将这些有序的数组合并在一起,从而完成排序。

图解

  1. 将待排序元素分成大小大致相同的两个序列
  2. 对两个序列分别进行归并排序
  3. 将排好序的有序子序列进行合并,得到最终的有序序列
    在这里插入图片描述

代码

# 合并, 将两个有序的子序列合并成一个序列
def merge(nums, low, mid, high):
    i, j = low, mid + 1
    k = 0
    temp = [0] * (high - low + 1)

    while i <= mid and j <= high:

        if nums[i] <= nums[j]:
            temp[k] = nums[i]
            i += 1
        else:
            temp[k] = nums[j]
            j += 1
        k += 1

    if i <= mid:
        temp[k:] = nums[i:mid+1]
    if j <= high:
        temp[k:] = nums[j:high+1]

    nums[low:high+1] = temp

    return nums
    

def merge_sort(nums, low = 0, high = len(nums)-1):
    if low < high:					# low = high时分解到只剩一个数,不用合并直接返回
        mid = low + (high - low) // 2
        merge_sort(nums, low, mid)			# 对左半部分进行归并排序
        merge_sort(nums, mid+1, high)		# 对右半部分进行归并排序
        return merge(nums, low, mid, high)	# 合并为有序子序列
    else:
        return nums

时间复杂度

归并算法的时间复杂度为 O(nlogn)

  • 分解:这一步仅仅是计算出子序列的中间位置,需要常数时间 O(1)
  • 解决子问题:递归求解两个规模为 n/2 的子问题,所需时间为 2T(n/2)
  • 合并:合并算法可以在 O(n) 时间内完成

所以总运行时间为:

在这里插入图片描述
当 n>1 时,可以递推求解:

在这里插入图片描述
递推最终的规模为 1, 令 2x = n,则 x = log n,那么

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp打包apk教程

文章目录 一、uniapp是什么&#xff1f;二、使用步骤1.需要有Java环境&#xff0c;安装jdk2.安装hbuilderx开发工具3.自签证书4.使用云打包 总结 一、uniapp是什么&#xff1f; ‌uni-app是一个基于Vue.js的跨平台应用开发框架&#xff0c;允许开发者使用一套代码同时构建iOS、…

Titanic - Machine Learning from Disaster————泰坦尼克号幸存者预测————逻辑回归、随机森林和梯度提升树(XGBoost、LightGBM)

目录 1. 引言 2. 理解 Titanic 数据集 目标变量 数据的初步探索 3. 数据预处理 3.1 处理缺失值 3.2 处理类别型特征 3.3 创建新特征 3.4 删除无关特征 3.5 确保所有特征都是数值型 4. 模型选择与训练 4.1 数据集拆分 4.2 选择和训练模型 4.2.1 逻辑回归模型 4.2…

MySQL笔记--多表查询

1--多表关系 多表关系基本上分为三种&#xff1a; 一对多&#xff08;多对一&#xff09;&#xff1b; 多对多&#xff1b; 一对一&#xff1b; 1-1--多对一 在多的一方建立外键&#xff0c;指向一的一方的主键&#xff1b; 1-2--多对多 建立第三张中间表&#xff0c;中间表至少…

利用git上传项目到GitHub

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了&#xff0c;非常受欢迎&#xff0c;比之svn更好。 GitHub可以免费使用&#xff0c;并且快速稳定。 利用GitHub&#xff0c;你可以将项目存档&#xff0c;与其他人分享交流&#xff0c;并让其他开发者帮助你一…

Gate学习(7)引入体素源

一、从GitHub下载体素源模型源码 下载地址&#xff1a;BenAuer2021/Phantoms-for-Nuclear-Medicine-Imaging-Simulation&#xff1a;用于核医学成像应用的模型&#xff08;闪烁显像、SPECT 和 PET&#xff09; --- BenAuer2021/Phantoms-For-Nuclear-Medicine-Imaging-Simulat…

快速启动Go-Admin(Gin + Vue3 + Element UI)脚手架管理系统

Go-Admin 是一个基于 Gin Vue Element UI & Arco Design & Ant Design 的前后端分离权限管理系统脚手架。它包含了多租户支持、基础用户管理功能、JWT 鉴权、代码生成器、RBAC 资源控制、表单构建、定时任务等功能。该项目的主要编程语言是 Go 和 JavaScript。 ps&a…

epoll反应堆模型

epoll反应堆模型 基于该视频所做笔记&#xff0c;视频里面讲的也挺难的&#xff0c;最好先让chat给你梳理一遍整体的代码再去看视频吧 15-epoll反应堆模型总述_bilibili_哔哩哔哩_bilibili 文章目录 epoll反应堆模型1.epoll反应堆模型概述2.具体讲解1.myevent_s结构体2.超时检…

F-Cooper论文精读(未完成)

F-Cooper 文章目录 背景有关边缘计算基于单目激光雷达数据的3D目标检测 创新点与以前比创新之处1&#xff1a;引入基于特征的协同感知&#xff08;F-Cooper&#xff09;框架创新2&#xff1a;所需数据量减少 2. 基于特征融合的车辆数据处理2.1 卷积特征图2.2 融合特征2.2.1 融…

Z240004基于Java+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…

嵌入式软考学习笔记(1)超详细!!!

目录 第一章计算机系统基础知识 1、逻辑运算 2、数的表示 3、总线系统 5、流水线 6、存储器 7、可靠性、校验码 第一章计算机系统基础知识 1、逻辑运算 与&#xff1a;有0则0&#xff0c;全1才1 或&#xff1a;有1则1&#xff0c;全0才0 异或&#xff1a;相同为0…

C# 探险之旅:第二十五节 - 类型class之字段Fields大冒险

嘿&#xff0c;探险家们&#xff01;欢迎再次搭乘C#的魔法列车&#xff0c;今天我们要深入探索class里的宝藏——字段&#xff08;Fields&#xff09;&#xff01;想象一下&#xff0c;字段就像是类里的秘密小房间&#xff0c;里面藏着对象的小秘密和宝藏。我们不仅要看看这些小…

时序论文31|NIPS24自注意力机制真的对时序预测任务有效吗?

论文标题&#xff1a;Are Self-Attentions Effective for Time Series Forecasting? 论文链接&#xff1a;https://arxiv.org/pdf/2409.18696 代码链接&#xff1a;https://github.com/dongbeank/CATS 前言 本文将重点转向探究自注意力机制在其中的有效性&#xff0c;提出…

Linux中openEuler 系统 配置mail.rc给邮箱发送邮件

这里用这个实验判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 查看当前磁盘剩余空间[rootserver ~]# df -h | grep "\/$" | cut -d" " -f4 | cut -d"G" -…

【51单片机】矩阵按键快速上手

51单片机矩阵按键是一种在单片机应用系统中广泛使用的按键排列方式&#xff0c;特别适用于需要多个按键但I/O口资源有限的情况。以下是对51单片机矩阵按键的详细介绍&#xff1a; 一、矩阵按键的基本概念 ‌定义‌&#xff1a;矩阵按键&#xff0c;又称行列键盘&#xff0c;是…

clearvoice 语音降噪、语音分离库

参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main ClearVoice 提供了一个统一的推理平台,用于语音增强、语音分离以及视听目标说话人提取。 代码参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main/clearvoice https://github.com/mode…

外观模式的理解和实践

外观模式&#xff08;Facade Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。该模式定义了一个高层的接口&#xff0c;使得子系统更容易使用。简单来说&#xff0c;外观模式就是通过引入一个外观角色…

【Email】基于SpringBoot3.4.x集成发送邮件功能

【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中&#xf…

Type-C接口电热毯的创新之旅

在科技日新月异的今天&#xff0c;智能家居产品正逐步渗透到我们生活的每一个角落&#xff0c;从智能灯光到温控系统&#xff0c;无一不展现着科技带来的便捷与舒适。而在这个追求高效与智能化的浪潮中&#xff0c;一款结合了最新科技元素的电热毯——Type-C接口电热毯&#xf…

【从零开始入门unity游戏开发之——C#篇09】if-else条件表达式、三元运算符、switch-case的使用

文章目录 一、if条件表达式1、if 语句基本结构示例输出&#xff1a; 2、else语句示例输出&#xff1a; 3、else if 语句示例输出&#xff1a; 4、组合逻辑运算符示例输出&#xff1a; 5、嵌套 if 语句示例输出&#xff1a;总结 二、三元运算符1、语法&#xff1a;2、示例&#…

CIFAR10 数据集介绍并转化为图片

CIFAR10数据集 CIFAR-10数据集是一个广泛使用的机器学习数据集&#xff0c;它包含10个类别的 60000 张32x32的彩色图像。每个类别有6000张图像&#xff0c;其中50000张用于训练&#xff0c;1000 张用于测试。这些类别包括&#xff1a; 飞机&#xff08;airplane&#xff09;汽车…