Python学习算法系列(5):归并排序与堆排序

【Python】堆排序 从本质上讲,堆是一种特殊的、基于树形结构的数据结构。 阅读详情

Python学习算法系列(5):归并排序与堆排序

1. 引言

在前几篇博客中,我们学习了插入排序和快速排序。本篇博客将继续介绍两种常见的排序算法:

  • 归并排序(Merge Sort)
  • 堆排序(Heap Sort)

我们将介绍它们的基本原理、代码实现以及性能分析。


2. 归并排序(Merge Sort)

2.1 归并排序原理

归并排序是一种采用分治法的排序算法,其基本思想是:

  1. 将数组分为两部分,分别进行排序。
  2. 将已排序的两部分合并成一个有序数组。

归并排序的关键在于“合并”操作,即将两个已排序的子数组合并成一个有序数组。

2.2 归并排序代码实现

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2  # 找到中间位置
    left = merge_sort(arr[:mid])  # 对左半部分递归排序
    right = merge_sort(arr[mid:])  # 对右半部分递归排序
    return merge(left, right)  # 合并排序结果

def merge(left, right):
    result = []
    i = j = 0
    # 合并左右两部分
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result

# 测试归并排序
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = merge_sort(arr)
print("排序后的数组:", sorted_arr)  # 输出 [11, 12, 22, 25, 34, 64, 90]

2.3 归并排序时间复杂度

归并排序的时间复杂度为:

  • 最好情况:O(n log n)
  • 最坏情况:O(n log n)
  • 平均情况:O(n log n)

归并排序的空间复杂度是 O(n),因为需要额外的空间来存储合并后的数组。


3. 堆排序(Heap Sort)

3.1 堆排序原理

堆排序是一种基于堆数据结构的排序算法,堆是一个完全二叉树,其每个父节点都大于或小于其子节点(最大堆或最小堆)。堆排序的过程如下:

  1. 构建最大堆(或最小堆),使得根节点是最大(或最小)元素。
  2. 将根节点(最大元素)与堆的最后一个元素交换,然后重新调整堆。
  3. 重复该过程,直到所有元素排序完成。

3.2 堆排序代码实现

def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1  # 左子节点
    right = 2 * i + 2  # 右子节点

    # 判断左子节点是否比根节点大
    if left < n and arr[left] > arr[largest]:
        largest = left
    # 判断右子节点是否比当前最大值大
    if right < n and arr[right] > arr[largest]:
        largest = right

    # 如果最大值不是根节点,则交换并继续调整堆
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)
    # 建立最大堆
    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)
    
    # 逐个交换根节点与最后一个元素,并调整堆
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)

# 测试堆排序
arr = [64, 34, 25, 12, 22, 11, 90]
heap_sort(arr)
print("排序后的数组:", arr)  # 输出 [11, 12, 22, 25, 34, 64, 90]

3.3 堆排序时间复杂度

堆排序的时间复杂度为:

  • 最好情况:O(n log n)
  • 最坏情况:O(n log n)
  • 平均情况:O(n log n)

堆排序的空间复杂度是 O(1),因为堆排序是原地排序,不需要额外的空间。


4. 排序算法的性能比较

以下是 归并排序 和 堆排序 与其他常见排序算法的时间复杂度比较:

算法时间复杂度(最好情况)时间复杂度(最坏情况)空间复杂度
冒泡排序O(n)O(n^2)O(1)
选择排序O(n^2)O(n^2)O(1)
插入排序O(n)O(n^2)O(1)
快速排序O(n log n)O(n^2)O(log n)
归并排序O(n log n)O(n log n)O(n)
堆排序O(n log n)O(n log n)O(1)

5. 总结

  • 归并排序:是一种稳定的排序算法,适用于大规模数据,时间复杂度为 O(n log n),但需要额外的空间来存储中间数组。
  • 堆排序:是一种原地排序算法,空间复杂度 O(1),适用于大规模数据,尽管时间复杂度也是 O(n log n),但性能通常不如快速排序。
  • 排序算法优化:对于大规模数据,归并排序和堆排序是非常有效的选择。

📢 下一篇 Python学习算法系列(6):基数排序与计数排序,敬请期待!🚀

💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!

python排序(快速排序、归并排序、堆排序) 排序是必须掌握的基本算法,在面试题也经常考到,这里写一下python的几种常用排序的写法。 快速排序 写法一 def quickSort(array,l,r): if l<r: q = partition(array,l,r) quickSort(array,l,q-1) quickSort(array,q+1,r) def parti... 阅读详情

相关推荐

Python十大排序算法(亲自实现代码超详细描述)

目录前言背景一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序七、堆排序八、计数排序九、桶排序十、基数排序参考来源后语 前言 你好,我是Dr.叶子,用心写最优美的博客,弹最好听的钢琴! 背景 最近整理知识点,发现在数据结构方面不是很扎实,所有自己重新学习排序算法,亲自利用Python来实现,与大家分享,也提升自己的知识水平!   一、冒泡排序 1. 原理描述: 2. 算法步骤: 3. 演示: 4. 代码实现: 在这里插入代码片   二、选择排序 1

Dr.叶子的博客 2015

python实现归并排序

归并排序 “归并"是将两个或者两个以上的有序表组成一个新的有序表。假定待排序表含有n个记录,则可以看成是n个有序的子表,每个子表长度为一,然后两两归并,得到n//2个长度为2或1的有序表;再两两归并,…直到合并成一个长度为n的有序表为止,这种方法称为2-路归并排序。 ...

liulanba的博客 3万+

Python实现归并排序算法(含完整源码)

归并排序(Merge Sort)是一种基于分治思想的经典排序算法,它将待排序的序列分成若干个子序列,对每个子序列进行排序,然后再将排好序的有序子序列合并成一个大的有序序列。函数,然后将结果合并成一个新的有序列表。我们可以看到,这里就是归并排序中的“分”和“治”。函数,用于将两个有序列表合并成一个新的有序列表。,并使用i、j两个指针分别遍历这两个列表,比较它们的元素大小,并将较小的插入到。以上就是本文介绍的Python实现归并排序算法的源代码,我们可以通过调用。函数用于归并排序,它接受一个待排序的列表。

与其临渊羡鱼,不如退而结网 753

排序算法:归并排序(python写法)

排序算法:归并排序(python写法)

Miss__xxzz的博客 2785

Python实现归并排序算法——代码详解

可以看到,该函数维护两个指针i和j,分别指向左右两部分数组的起始位置,比较当前两个指针所指的元素大小,并将较小的元素加入结果数组中。总之,归并排序是一种简单而高效的排序算法,可以应用于各个领域的排序问题。使用Python实现归并排序算法不仅易于理解,同时也能够充分发挥Python作为高级语言的优势,提升排序算法的实现效率。归并排序是一种基于比较的排序算法,它将一个序列不断地分割成小块,直到每个小块只有一个元素。可以看到,若待排序数组的长度小于等于1,则无需排序,直接返回该数组。

. 795

归并排序的Python代码实现

它通过递归地将数组划分为更小的子数组,并将这些子数组按照顺序合并起来,从而实现对整个数组的排序。在分解步骤中,我们将原始数组递归地划分为更小的子数组,直到每个子数组只包含一个元素。然后,在合并步骤中,我们将这些单个元素的子数组按照顺序合并起来,形成一个有序的数组。归并排序是一种经典的排序算法,它基于分治的思想,将一个大问题划分为多个小问题,然后将这些小问题的解合并起来得到最终的结果。归并排序的时间复杂度为O(nlogn),其中n是数组的长度。现在,我们可以使用上述的归并排序函数对一个数组进行排序。

YOLOv6666的博客 137

【算法系列 | 6】深入解析排序算法之——堆排序

堆排序(Heap Sort)是一种基于堆数据结构的排序算法,其核心思想是将待排序的序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换,再将剩余元素重新调整为最大堆(或最小堆),重复以上步骤直到所有元素都有序。

颜淡慕潇 1万+

手把手教你用Boot-Repair快速修复Ubuntu启动分区缺失(附详细命令行步骤)

本文详细介绍了如何使用Boot-Repair工具快速修复Ubuntu启动分区缺失问题,包括诊断、应急准备、自动修复和手动命令操作。通过grub rescue模式下的关键命令和Boot-Repair的图形界面操作,帮助用户高效解决启动分区故障,确保系统恢复正常运行。

weixin_29229989的博客 563

【算法系列 | 4】深入解析排序算法之——归并排序

排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。以下是一些常见的排序算法:冒泡排序(Bubble Sort)插入排序(Insertion Sort)选择排序(Selection Sort)归并排序(Merge Sort)快速排序(Quick Sort)堆排序(Heap Sort)归并排序(Merge Sort)是一种基于分治思想的排序算法,它将待排序的数组分成两部分,分别对这两部分递归地进行排序,最后将两个有序子数组合并成一个有序数组。

颜淡慕潇 2万+

【Solidworks学习使用(1)__2022版本保姆级安装方法】

Solidworks 2020安装

coder-kimbell的博客 6256

48、基于头部电信号和触觉的人机交互技术研究

本文探讨了基于头部电信号控制决策和触觉感知的人机交互技术。通过EEG信号采集与ANN模型(TDNN/PRNN)分析,实现对用户意图的识别;同时利用触觉传感接口识别操作员有意接触,提升人机协作安全性。研究涵盖系统设计、数据处理流程、实验结果及技术拓展方向,并展望了两种技术在工业、医疗与智能家居等领域的融合应用前景。

i1j2k的博客 100

python算法学习(7)——堆排序

列表排序的重要排序有三种,分别是快速排序、堆排序和归并排序。

qq_74868273的博客 1960

【乐鑫】唤醒词修改方法

乐鑫科技的语音识别模块(如ESP-SR)支持自定义唤醒词,但需通过官方工具链完成。

以实战经验介绍行业知识 827

排序算法之高效排序:快速排序,归并排序,堆排序详解

相较于上一期我讲的冒泡、选择、插入等基础排序,快速排序、归并排序和堆排序凭借更优的时间复杂度,成为处理大规模数据排序任务的首选方案。本文我将深入剖析这三种高效排序算法的原理、实现细节、性能特点及适用场景,助力你掌握它们在实际开发中的应用技巧。

1799

深度强化学习 | 详解基于价值的强化学习DQN算法(附Pytorch实现)

深度Q网络DQN的核心原理是通过经验回放池和目标网络技术拟合高维状态空间,是Q-Learning算法的深度学习版本,本文分析DQN的基本算法,并给出训练实例和实际案例

FRIGIDWINTER的博客 4985

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 471

探究排序算法的奥秘(下):快速排序、归并排序、堆排序

本文介绍三种更高效的排序算法:快速排序、归并排序和堆排序。我们从算法思想、原理、代码实现(C语言、Python、Java)、性能分析以及使用场景等方面进行深入探讨

小L的博客 1454

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程

2023最新多文明策略手游《万国觉醒内购版》最新整理Linux商业手工服务端+安卓+详细搭建教程。源码内置详细搭建教程,感兴趣可自行下载。

百创科技 1713

python数据结构与算法-5 列表排序-2快速排序、堆排序、归并排序

列表排序之快速排序、堆排序、归并排序

qq_35097570的博客 1251

checking OpenSSL library version... configure: error: OpenSSL >= 1.1.1 required (have “100020bf 解决方案

 本文主要介绍了checking OpenSSL library version… configure: error: OpenSSL >= 1.1.1 required (have “100020bf (OpenSSL 1.0.2k-fips 26 Jan 2017)”)解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python堆排序、归并排序

'''堆排序''' #构造大根堆 def createHeap(mylist,index,heap_size): #建立堆的起始索引 largest = index #左右孩子结点 left_child = 2 * index + 1 right_child = 2* index + 2 #判断左右孩子索引是否超出索引;并且比较值的大小 ...

qq_45061361的博客 253

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

史上最简单十大排序算法(Python实现)

目录 十大排序算法(Python实现) 一. 算法介绍及相关概念解读 算法分类 相关概念 1. 交换排序 1.1 冒泡排序(Bubble Sort) 1.2 快速排序(Quick Sort) 2. 插入排序 2.1 简单插入排序(Insert Sort) 2.2 希尔排序(Shell Sort) 3.选择排序 3.1 简单选择排序(Select Sort) 3.2 堆排序...

白糖炒栗子 6万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python实现归并排序、堆排序

堆排序是一种基于堆数据结构的排序算法。堆是一棵完全二叉树,分为最大堆和最小堆。最大堆中,每个节点的值都大于或等于其子节点的值;最小堆中,每个节点的值都小于或等于其子节点的值。通过以上实现,可以看到这两种排序算法在不同场景下的适用性。归并排序适用于需要稳定排序的场景,而堆排序适用于对空间复杂度有要求的场景。归并排序是一种基于分治思想的排序算法。它将数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并成一个有序数组。

闲人编程的博客 326

python归并排序函数详解_python 实现归并排序算法

python数据结构与算法总结python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章:《数据结构和算法对python意味着什么?》《顺序表数据结构在python中的应用》《python实现单向链表数据结构及其基本方法》《python实现单向循环链表数据结构及其方法》《python实现双向...文章python之战2019-04-241168浏览量算法基础:五大排序算法...

weixin_39568926的博客 1041

python堆排序算法_python 排序 堆排序

算法思想 :堆排序利用堆数据结构设计的一种排序算法,堆是一种近似完全二叉树的结构,同时满足堆积的性质,即对于任意的i均有ki>=k(2i+1),ki>=k(2i+2)步骤:将数组转化为最大堆将当前堆的根结点和最后一个结点交换,然后将前n-1个元素转化为最大堆重复上一过程为什么要是最大堆呢,因为这样方便再第二步交换的时候可以将最大的放在最后,得到最后升序的结果算法实现:堆排序的主要复杂的...

weixin_39747087的博客 174

4-2 Python面试常考算法

一、算法常考点 排序+查找,重中之重 1.常考排序算法:冒泡排序、快速排序、归并排序、堆排序 2.线性查找、二分查找等 3.能独立实现代码(手写),能够分析时间空间复杂度 二、常用排序算法时空复杂度 排序算法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n^2) O(n^2) 稳定 O(1) 选择排序 O(n^2) O(n^2) 不稳定 `O(1) 插入排序 O(n^2) O(n^2) 稳定 `O(1) 快速排序 O(n^2) O(n*log2n) 不稳定 O

元文的博客 5160
上一篇: Python学习算法系列(4):插入排序与快速排序
下一篇: Python学习算法系列(6):基数排序与计数排序
DoYangTan
博客等级 码龄5年 1946粉丝 319原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值