Python编程:排序算法之堆排序

简介: Python编程:排序算法之堆排序

树是一种可以递归定义的数据结构


树是由n个节点组成的集合


n=0 空树

n>0 一个根节点,其他节点分为m个集合,每个集合本身又是一棵树

一些概念


根节点,叶子节点

树的深度(高度)

树的度

孩子节点、父节点

子树

二叉树

度不超过2的树(节点最多有两个叉)特殊的树

满二叉树

完全二叉树

image.png

二叉树的存储方式

  • 链式存储
  • 顺序存储

父节点和左孩子节点编号关系: i -> 2i+1

父节点和右孩子节点编号关系: i -> 2i+2

堆排序

  • 特殊的完全二叉树
  • 大根堆:任一节点都比其孩子节点大
  • 小根堆:任一节点都比其孩子节点小

image.png

image.png

代码实现


import random
# 调整
def sift(lst, low, high):
    child = 2 * low + 1  # 左孩子
    tmp = lst[low]
    while child < high:  # 孩子在堆里
        # 如果有右孩子且比左孩子大(找到左右孩子中较大的那个)
        if child + 1 <= high and lst[child] < lst[child+1]:
            child += 1  # 孩子指向右孩子
        # 孩子比父节点大
        if lst[child] > tmp:
            lst[low] = lst[child]  # 孩子调整到父节点上
            low = child  # 孩子成为新的父节点点
            child = 2 * low + 1  # 新的孩子节点
        else:
            break
    lst[low] = tmp  # 根节点放到父亲位置
# 堆排序
def heap_sort(lst):
    n = len(lst)  # 列表总长度,也就是最后一个值
    for i in range(n//2 - 1, -1, -1):
        sift(lst, i, n-1)
    # i指向堆的最后
    for i in range(n-1, -1, -1):
        # 根节点取出,最后一个孩子上位
        lst[0], lst[i] = lst[i], lst[0]
        sift(lst, 0, i-1)  # 调整出新根节点
lst = list(range(10))
random.shuffle(lst)
heap_sort(lst)
print(lst)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
相关文章
|
3天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
34 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
1天前
|
存储 数据采集 人工智能
探索Python编程之美——从基础到进阶
【9月更文挑战第9天】本文是一篇深入浅出的技术分享文章,旨在引导读者从零基础开始掌握Python编程。我们将通过生动的实例和代码示例,探讨Python的基本语法、数据结构、函数、模块以及面向对象编程等核心概念。无论你是初学者还是有一定经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python编程之旅吧!
16 11
|
2天前
|
Python
探索Python编程的奥秘:打造你的第一个程序
【9月更文挑战第8天】本文将带你进入Python编程的世界,通过一个有趣的项目——制作一个简单的猜数字游戏,让你快速入门。我们不仅会分享代码编写的步骤,还会讲解每一行代码的含义和作用,确保即使是编程新手也能跟上节奏。文章末尾附有完整代码,方便读者实践和学习。
19 12
|
3天前
|
API Python
探索Python中的多线程编程
探索Python中的多线程编程
21 5
|
3天前
|
Python
揭秘!Python系统编程里那些让代码自由穿梭的神奇代码行
【9月更文挑战第9天】在Python的世界里,一些简洁的代码行却蕴含着强大的功能,如列表推导式让列表生成仅需一行代码:`squares = [x**2 for x in range(10)]`。`with`语句则能自动管理文件和网络连接的关闭,如`with open(&#39;example.txt&#39;, &#39;r&#39;) as file:`。`lambda`函数和装饰器则允许快速定义函数和增强功能,而上下文管理器更是资源处理的利器。这些特性让Python代码更加优雅高效。
11 4
|
1天前
|
安全 数据安全/隐私保护 Python
Python系统编程实战:文件系统操作与I/O管理,让你的代码更优雅
【9月更文挑战第10天】Python不仅在数据分析和Web开发中表现出色,在系统编程领域也展现出独特魅力。本文将带你深入探讨Python中的文件系统操作与I/O管理,涵盖os、shutil和pathlib等模块的基础使用方法,并通过示例代码展示如何优雅地实现这些功能。通过掌握缓冲、异步I/O等高级特性,你将能够编写更高效、安全且易于维护的Python代码。示例包括使用pathlib遍历目录、设置缓冲区提升文件写入性能以及使用aiofiles实现异步文件操作。掌握这些技能,让你在Python系统编程中更加得心应手。
10 2
|
3天前
|
存储 Java 数据处理
深入骨髓的Python系统编程:文件系统操作与I/O管理,揭秘底层奥秘
【9月更文挑战第9天】本文通过问答形式深入探讨Python中文件系统操作与I/O管理的核心技巧,涵盖高效遍历文件系统、理解I/O缓冲机制、并行处理文件I/O以及关键异常处理方法。通过具体示例代码,展示了如何利用os和pathlib模块简化文件遍历,控制I/O缓冲,使用多进程提高处理效率,并妥善处理各种I/O异常,助你提升Python系统编程能力。
16 3
|
4天前
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
12 4
|
存储 算法 搜索推荐
十大排序算法思想与 Python 实现(下)
一般排序算法最常考的:快速排序和归并排序。这两个算法体现了分治算法的核心观点,而且还有很多出题的可能。
十大排序算法思想与 Python 实现(下)
|
搜索推荐 算法 索引
十大排序算法思想与 Python 实现(上)
一般排序算法最常考的:快速排序和归并排序。这两个算法体现了分治算法的核心观点,而且还有很多出题的可能。