归并排序(Merge Sort)

归并排序(Merge Sort)是一种采用分治策略的排序算法。其基本思想是将待排序的序列分成两半,分别对这两半进行排序,然后将两个已排序的半序列合并成一个完整的有序序列。这个过程可以递归进行,直到待排序序列只有一个元素为止。

以下是归并排序的基本步骤:

  1. 分解:将待排序的序列分为两半(如果序列长度为奇数,可以稍许偏斜)。

  2. 递归:对每一半分别进行归并排序。

  3. 合并:将两个已排序的半序列合并成一个完整的有序序列。合并的过程是:从两个半序列的起始位置开始,依次比较它们的当前元素,将较小者放入结果序列,并将相应的指针向后移动一位。当一个半序列遍历完后,将另一个半序列剩余的元素直接追加到结果序列。

时间复杂度

  • 最好情况最坏情况平均情况:无论输入数组的原始顺序如何,归并排序的时间复杂度均为 O(nlogn)。这是因为每次分解都将待排序序列的长度减半,递归树的高度为logn,而合并过程中需要线性扫描两个子序列,因此总的时间复杂度为 O(nlogn)。

空间复杂度:归并排序需要额外的存储空间来合并两个子序列,空间复杂度为O(n)。这是归并排序的主要缺点,特别是在处理大型数据集时,可能会受到内存限制。

稳定性:归并排序是稳定的排序算法,即相同值的元素在排序前后相对位置不会改变。

尽管归并排序的空间复杂度相对较高,但由于其稳定的排序性质和对输入数据顺序不敏感的优秀性能,尤其在处理链表、文件等不适合进行原地排序的数据结构时,归并排序仍具有很高的实用价值。以下是归并排序的Python实现:

 

Python

1def merge_sort(arr):
2    if len(arr) <= 1:  # 基础情况:数组长度为0或1时,已是有序
3        return arr
4
5    mid = len(arr) // 2  # 找到中间位置
6    left = arr[:mid]  # 左半部分
7    right = arr[mid:]  # 右半部分
8
9    # 递归对左右子序列进行归并排序
10    left_sorted = merge_sort(left)
11    right_sorted = merge_sort(right)
12
13    # 合并两个已排序的子序列
14    return merge(left_sorted, right_sorted)
15
16
17def merge(left, right):
18    merged = []
19    i = j = 0
20
21    # 依次比较两个子序列的当前元素,将较小者放入结果序列
22    while i < len(left) and j < len(right):
23        if left[i] <= right[j]:
24            merged.append(left[i])
25            i += 1
26        else:
27            merged.append(right[j])
28            j += 1
29
30    # 将剩余的元素追加到结果序列
31    merged.extend(left[i:])
32    merged.extend(right[j:])
33
34    return merged

通过递归对左右子序列进行归并排序,然后调用merge函数合并两个已排序的子序列。merge函数中,从两个子序列的起始位置开始,依次比较并合并元素,直至一个子序列遍历完,将另一个子序列剩余元素追加到结果序列。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打破次元壁!Stable Diffusion将现实影像转成二次元动画,推特转赞10k+,网友:都可以重做《神奇宝贝》动漫了

破次元壁计划已启动&#xff01; 就在最近&#xff0c;有网友分享了一个用Stable Diffusion打造二次元动画的工具&#xff0c;直接在网上爆火。 先快来看一波效果。 万物皆可妙化为二次元&#xff0c;耳机也可蜕变成小兔兔&#xff1a; 瞧&#xff01;连易拉罐的拉环也化身成…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

Oracle SQL Developer导出数据库表结构,表数据,索引以及序列号等对象

通过Oracle SQL Developer软件将指定oralce数据库中的表结构&#xff0c;表数据&#xff0c;索引以及序列号等对象导出成SQL文件。 数据库版本&#xff1a;Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 软件版本&#xff1a;Oracle SQL Develo…

【千帆平台】使用AppBuilder零代码创建应用,Excel表格数据转为Markdown格式文本

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用名称应用描述应用头像角色指令组件能力开场白推…

【Python】一道字典题目

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) 输出台&#xff1a;

构建一个快速数据分析(boruta+shap+rcs)的shiny APP

构建一个快速数据分析&#xff08;borutashaprcs&#xff09;的shiny APP 之前提出了一个快速数据分析的流程&#xff0c;包括&#xff1a; 变量筛选&#xff0c;使用Boruta等变量筛选的方法来找出相关的变量&#xff1b;发现规律&#xff0c;使用SHAP分析的散点图、交互作用图…

如何使用Python下载哔哩哔哩(Bilibili)视频字幕

在本文中&#xff0c;我将向大家展示如何使用Python下载哔哩哔哩&#xff08;Bilibili&#xff09;视频的字幕。通过这个方法&#xff0c;你可以轻松地获取你喜欢的视频的字幕文件&#xff0c;方便学习和交流。 准备工作 在开始之前&#xff0c;我们需要安装一些必要的库&…

第一个C++项目

文章目录 一、新建项目1.打开软件&#xff0c;选择“创建新项目”2.新建项目栏中&#xff0c;按自己的需求来设置项目模板&#xff0c;项目名称和文件存放位置&#xff0c;设置好后点击“确认”3. 点击“Next”4. 按照自己需求设置&#xff0c;设置完后&#xff0c;点击“Next”…

【Linux 性能详解】CPU性能篇

目录 平均负载&#xff08;Load Average&#xff09; CPU上下文切换 进程上下文切换 线程上下文切换 中断上下文切换 中断 硬中断 软中断 CPU使用率 性能分析工具 平均负载&#xff08;Load Average&#xff09; 平均负载&#xff1f;这个词对很多人来说&#xff0c…

【新三个数排序的自创算法,这是我厉年来很满意的一次排序算法设计,最好小于O(N)最坏O((NN/3)/2)。】2024-5-7

缘由如何用C&#xff0b;&#xff0b;解决一下问题_编程语言-CSDN问答 int a[]{1, 4, 7, 8, 5, 2, 3, 6, 9, 7}, n 10, x n, jh 0, j 0;px:if (j < n) {//缘由https://ask.csdn.net/questions/8099444if (--x < 2 j)x n - 1, j 3;if (x < n - 1 && a[x…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…

湘潭大学数据库作业题完整答案

作业一&#xff1a; 考虑如下所示的关系数据库。这些关系上适当的主码是什么&#xff1f; 职工&#xff08;姓名&#xff0c;街道&#xff0c;城市&#xff09; 工作&#xff08;姓名&#xff0c;公司名&#xff0c;工资&#xff09; 公司&#xff08;公司名&#xff0c;城市&a…

UVa1376/LA3661 Animal Run

UVa1376/LA3661 Animal Run 题目链接题意输入格式输出格式 分析AC 代码 题目链接 UVA - 1376 Animal Run 题意 由于控制程序出了 bug&#xff0c;动物园的笼子无缘无故被打开&#xff0c;所有动物展开了一次大逃亡。整个城市是一个网格&#xff0c;另外每个单位方格都有一条从…

win平台c语言引入开源库的问题与解决,以引入cJSON库为例

目录 遇到的问题 开源依赖库引入的问题 问题的解决 生成dll文件 方式一 方式二 在VsCode中如何使用开源库 文件放置位置 配置文件进行配置 引入头文件 结束 许久不写博客&#xff0c;五一还在加班&#xff0c;就浅浅写一篇吧。 最近除了做物联网平台,还对网关二次开…

如何恢复手机视频?手机视频恢复软件有哪些?

随着手机使用的普及&#xff0c;我们的日常生活、工作甚至娱乐都与它息息相关。而在其中&#xff0c;我们宝贵的视频文件则是记录下我们生活、工作和重要时刻的重要载体。然而&#xff0c;当这些视频文件不幸丢失或被误删&#xff0c;我们的内心往往会感到一阵恐慌。这时候&…

团队执行力差,多半都是管理的问题

在日常管理中&#xff0c;我们习惯用“执行力好不好”来评价一个团队的表现&#xff0c;但实际上&#xff0c;执行力更应该是一个管理者需要思考和解决的问题&#xff0c;而非单纯归咎于团队。 我们需要明确一点&#xff1a;执行力不是团队的问题&#xff0c;而是管理者的问题…

nestjs版若依全栈管理后台完全开源!

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续和大家分享一下我们小伙伴开源的基于 nestjs 的若依全栈管理系统。 相信前端小伙伴对若依管理系统并不陌生&#xff0c;它的后端采用…

浙大最新开源:MGMap-掩码引导学习的在线矢量化高精地图构建方法

论文标题&#xff1a; MGMap: Mask-Guided Learning for Online Vectorized HD Map Construction 论文作者&#xff1a; Xiaolu Liu, Song Wang, Wentong Li, Ruizi Yang, Junbo Chen, Jianke Zhu 作者单位&#xff1a;浙江大学&#xff0c;有鹿科技 开源地址&#xff1a;…

Android 网络请求 实现

Android 网络请求 实现 一、背景 在Android开发中,网络请求是一个非常常见的需求。应用程序可能需要与远程服务器通信来获取数据、上传文件、验证用户身份等等。背景下,Android应用通常会面临以下几个主要情况和挑战: ①数据交互: 许多应用程序需要从服务器获取数据,例…

taos数据库服务器安装

涛思数据库服务器安装分为两种情况 一。新服务器直接安装&#xff08;非常好&#xff09; 二。旧服务器删除后删除干净再安装&#xff08;麻烦得很&#xff09; 先来讲解一下情况一&#xff1a; 找需要的taos安装版本链接&#xff1a;https://docs.taosdata.com/releases/tde…
最新文章