python 归并排序(Merge Sort)

归并排序(Merge Sort)

归并排序是一种高效的排序算法,采用分治法(Divide and Conquer)策略。它的基本思想是:将数组递归地分成两半,分别对两半进行排序,然后将排序后的两半合并成一个有序数组。

归并排序的步骤:
  1. 分解:将数组递归地分成两半,直到每个子数组只有一个元素。
  2. 排序:对每个子数组进行排序(由于子数组只有一个元素,本身已经有序)。
  3. 合并:将两个有序的子数组合并成一个有序数组。
时间复杂度:
  • 最坏情况:O(n log n)
  • 最好情况:O(n log n)
  • 平均情况:O(n log n)
空间复杂度:
  • O(n) —— 需要额外的空间来存储合并后的数组。

Python 实现

def merge_sort(arr):if len(arr) <= 1:return arr# 将数组分成两半mid = len(arr) // 2left_half = merge_sort(arr[:mid])  # 递归排序左半部分right_half = merge_sort(arr[mid:])  # 递归排序右半部分# 合并两个有序数组return merge(left_half, right_half)def merge(left, right):sorted_array = []i = j = 0# 比较两个数组的元素,依次将较小的元素加入结果数组while i < len(left) and j < len(right):if left[i] < right[j]:sorted_array.append(left[i])i += 1else:sorted_array.append(right[j])j += 1# 将剩余的元素加入结果数组sorted_array.extend(left[i:])sorted_array.extend(right[j:])return sorted_array# 示例使用
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("排序后的数组:", sorted_arr)

输出结果

排序后的数组: [3, 9, 10, 27, 38, 43, 82]

归并排序的详细过程

以数组 [38, 27, 43, 3, 9, 82, 10] 为例:

  1. 分解

    • 将数组分成 [38, 27, 43, 3][9, 82, 10]
    • 继续分解:
      • [38, 27, 43, 3] 分成 [38, 27][43, 3]
      • [9, 82, 10] 分成 [9][82, 10]
    • 继续分解:
      • [38, 27] 分成 [38][27]
      • [43, 3] 分成 [43][3]
      • [82, 10] 分成 [82][10]
  2. 排序

    • 每个子数组只有一个元素,本身已经有序。
  3. 合并

    • 合并 [38][27] 得到 [27, 38]
    • 合并 [43][3] 得到 [3, 43]
    • 合并 [27, 38][3, 43] 得到 [3, 27, 38, 43]
    • 合并 [9][10, 82] 得到 [9, 10, 82]
    • 合并 [3, 27, 38, 43][9, 10, 82] 得到 [3, 9, 10, 27, 38, 43, 82]

归并排序的优缺点

优点

  • 时间复杂度稳定为 O(n log n),性能优异。
  • 是稳定的排序算法(相同元素的相对位置不变)。
  • 适用于链表等非连续存储结构。

缺点

  • 需要额外的存储空间,空间复杂度为 O(n)。
  • 对于小规模数据,性能可能不如插入排序等简单算法。

归并排序的适用场景

  • 需要稳定排序的场景。
  • 数据规模较大。
  • 适用于链表等非连续存储结构。

优化归并排序

  1. 小数组使用插入排序

    • 当数组规模较小时,插入排序的效率更高。
  2. 原地归并排序

    • 通过复杂的实现,可以减少额外的存储空间,但会增加代码复杂度。

优化后的归并排序实现

def merge_sort_optimized(arr):if len(arr) <= 10:  # 小数组使用插入排序return insertion_sort(arr)mid = len(arr) // 2left_half = merge_sort_optimized(arr[:mid])right_half = merge_sort_optimized(arr[mid:])return merge(left_half, right_half)def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and arr[j] > key:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr# 示例使用
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort_optimized(arr)
print("优化后的排序数组:", sorted_arr)

总结

归并排序是一种高效且稳定的排序算法,适用于大规模数据的排序。通过优化策略,可以进一步提高其性能。

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

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

相关文章

AI安全的挑战:如何让人工智能变得更加可信

引言 随着人工智能&#xff08;AI&#xff09;技术在各个领域的广泛应用&#xff0c;尤其是在医疗、金融、自动驾驶和智能制造等行业&#xff0c;AI正在重塑我们的工作和生活方式。从提高生产效率到实现个性化服务&#xff0c;AI带来了前所未有的便利。然而&#xff0c;在享受这…

去除el-tabs 下面的灰色横线,并修改每一项的左右间距,和字体颜色

HTML <el-tabs v-model"activeName" class"demo-tabs" tab-click"handleClick"><el-tab-pane label"全部" :name"null"></el-tab-pane><el-tab-pane label"问答陪练" name"general-t…

C++算法20例

1、求两个数的最大公约数 int gcd(int a, int b) { 2 return b 0 ? a : gcd(b, a % b); 3} 2、判断素数 bool isPrime(int n) {if (n < 1) return false; for (int i 2; i * i < n; i) {if (n % i 0) return false;}return true; } 3、冒泡排序 void bubbleSort…

截图技术方案

安卓截屏技术附带悬浮窗自动存储功能_安卓截图浮窗-CSDN博客 https://chat.baidu.com/search?dyTabStrMCwxMiwzLDEsMiwxMyw3LDYsNSw5&pdcsaitab&setypecsaitab&extParamsJson%7B%22apagelid%22%3A%2210990774271994514433%22%2C%22enter_type%22%3A%22a_ai_index%…

气象数据Grib及Python绘图

文章较长&#xff0c;却将所有常见的气象数据类型进行了详细的介绍&#xff0c;对各种方法的优劣势进行了详细分析&#xff0c;相信对于阅读者来说会有一定程度的帮助 目录 GRIB 数据格式简介 使用Python处理Grib文件 法1&#xff1a;使用pygrib库 法2&#xff1a;使用cf…

sqlite3 python如何查表结构

在SQLite3中&#xff0c;通过Python的sqlite3模块可以方便地查询表结构。以下是几种常用的方法来获取表结构信息&#xff0c;包括列名、数据类型和其他属性。 使用 PRAGMA table_info 最直接的方法是使用 PRAGMA table_info 命令。这个命令会返回指定表中每一列的信息&#x…

Selenium和WebDriver的安装与配置

1、Selenium的安装 直接黑窗口执行&#xff1a;pip install selenium3.141.0 可能遇到的问题&#xff1a; 解决方法配置环境变量&#xff1a; 找到目录&#xff1a;&#xff08;以自己电脑为准&#xff09; C:\Users\Administrator\AppData\Local\Programs\Python\Python38-…

HTML——45.单元格合并

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>表格</title></head><body><!--合并单元格&#xff1a;1.在代码中找到要合并的单元格2.在要合并的所有单元格中&#xff0c;保留要合并的第一个单元格…

APP项目测试 之 APP性能测试-- 性能测试工具(SoloPi工具)

1.SoloPi简介 &#xff08;1&#xff09;什么是SoloPi&#xff1f; SoloPi&#xff1a; 是一个无线化、非侵入式的 Android 自动化工具 &#xff0c;具备 录制回放、性能测试 等功能。 &#xff08;2&#xff09;SoloPi的作用是什么&#xff1f; 基础性能测试&#xff1a;能够…

chatgpt model spec 2024

概述 这是模型规范的初稿&#xff0c;该文档规定了我们在OpenAI API和ChatGPT中的模型的期望行为。它包括一组核心目标&#xff0c;以及关于如何处理冲突目标或指令的指导。 我们打算将模型规范作为研究人员和数据标注者创建数据的指南&#xff0c;这是一种称为从人类反馈中进…

IOS safari 播放 mp4 遇到的坎儿

起因 事情的起因是调试 IOS 手机下播放服务器接口返回的 mp4 文件流失败。对于没调试过移动端和 Safari 的我来说着实费了些功夫&#xff0c;网上和AI也没有讲明白。好在最终大概理清楚了&#xff0c;在这里整理出来供有缘人参考。 问题 因为直接用 IOS 手机的浏览器打开页面…

Mac 环境 VVenC 编译与编码命令行工具使用教程

VVenC VVenC 是一个开源的高效视频编码器&#xff0c;专门用于支持 H.266/VVC (Versatile Video Coding) 标准的编码。H.266/VVC 是继 HEVC (H.265) 之后的新一代视频编码标准&#xff0c;主要目的是提供比 HEVC 更高的压缩效率&#xff0c;同时保持或提高视频质量。H.266/VVC…

【0379】Postgres内核 Walreceiver (libpqwalreceiver API)分析

文章目录 1. libpqwalreceiver API1.1 四个函数2. Walreceiver IPC3. Walsender IPC4. Walsender - walreceiver protocol1. libpqwalreceiver API walreceiver 中与传输相关的部分,其负责连接主服务器、接收 WAL 文件以及发送消息,是动态加载的,以避免主服务器的二进制文件…

Mediatek Android13 ROM定制

目录 1、系统签名 2、默认关闭WIFI 3、默认关闭Bluetooth 4、默认关闭NFC 5、移除物理键盘支持 6、禁止 ANR、崩溃等的对话框显示 7、修改默认壁纸 8、取消USB PTP MTP MIDI等支持 9、设置Screen Lock默认为None 10、设置Data&time自动 11、设置特定时区 12、设…

手搓一个ChatUI需要分几步

只关注项目代码的同学可以直接跳转目录中的正文部分&#xff0c;查看项目仓库和功能介绍。 引言 Chatbot的UI界面设计&#xff0c;是和传统软件不同的&#xff1a;都是当面一个简洁的对话框&#xff0c;框里预备着热乎的工具&#xff0c;可以随时更新。 像我这样做工的牛马&a…

linux更换yum源

1.备份系统源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2.下载国内的yum源到/etc/yum.repos.d/CentOS-Base.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo如无法使用wget命令也可以…

IDEA 社区版 SpringBoot不能启动

报错原因&#xff0c;Failed to load class [javax.servlet.Filter] <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope> </dependency>…

FPGA 4x4矩阵键盘 实现

1原理 FPGA(现场可编程门阵列)4x4矩阵键盘的实现原理主要基于行列扫描法,通过FPGA对键盘的扫描和识别,实现对键盘输入信号的采集和处理。以下是对FPGA 4x4矩阵键盘实现原理的详细解释: 一、矩阵键盘的基本原理 结构:4x4矩阵键盘由4行和4列组成,共16个按键。每个按键位…

如何进行有效沟通?

在信息化系统项目中进行有效沟通&#xff0c;可以参考以下策略和技巧&#xff1a; 沟通技巧 明确沟通目的&#xff1a;确保每次沟通都有明确的目标&#xff0c;了解沟通接收方的需求及偏好&#xff0c;并监督衡量沟通效果。 使用5C原则&#xff1a;正确的语法和拼写&#xff…

018-spring-基于aop的事务控制

1 先配置平台事务管理器 2 在配置 spring提供的advice 3 事务增强的aop 总结&#xff1a; 事务就是要做2个配置&#xff1a; <!-- 1 开启事务管理器 不同的框架对应不同的事务管理器 --> <bean id"transactionManager" class"org.springframework.j…