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

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

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


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


n=0 空树

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

一些概念


根节点,叶子节点

树的深度(高度)

树的度

孩子节点、父节点

子树

二叉树

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

满二叉树

完全二叉树

b1.1.png

二叉树的存储方式

  • 链式存储
  • 顺序存储

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

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

堆排序

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

b1.2.png


调整

堆排序过程

  1. 建立堆
  2. 得到堆顶元素,为最大元素
  3. 去掉堆顶,将堆最后一个元素放到堆顶,此时可以通过一次调整重新使堆有序
  4. 堆顶元素为第二大元素
  5. 重复步骤3,直到堆变空

b1.3.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]


相关文章
|
SQL 消息中间件 存储
PostgreSQL CDC的最佳实践
PostgreSQL CDC的最佳实践
PostgreSQL CDC的最佳实践
|
9月前
|
安全 程序员 PHP
实验室信创平台上几道经典的web-php有关的题目wp
本内容介绍了多个CTF题目及其解题思路,涵盖正则表达式、PHP函数、代码审计等方面。例如,通过POST提交和正则匹配获取flag,利用PHP的松散比较和数组特性绕过验证,以及通过恢复VIM临时文件和SVN隐藏文件夹获取关键信息。每个题目都提供了详细的解题步骤和相关链接,适合初学者学习和实践。
112 1
|
12月前
|
PHP
ThinkPHP6的控制器定义及控制器初使用
本文介绍了ThinkPHP6框架中控制器的定义和初步使用方法。内容包括控制器的文件位置、命名规范、如何改变控制器目录名、单应用模式下的项目访问路径,以及控制器类文件的实际位置和访问URL的示例。文章还提到了ThinkPHP的控制器类可以灵活定义,无需继承任何基础类库,但建议继承一个基础的控制器类以方便扩展。控制器名不区分大小写,并且支持驼峰命名转下划线的方式。
ThinkPHP6的控制器定义及控制器初使用
|
jenkins 持续交付 API
使用Python操作Jenkins的过程详解
Python作为一种简洁、灵活且功能丰富的编程语言,可以与各种API轻松集成,Jenkins的API也不例外。借助于Python中的python-jenkins模块,我们可以轻松地编写脚本来连接到Jenkins服务器,并执行各种操作,如创建、删除、构建Jobs等。这种自动化的方式不仅提高了效率,还使得CI/CD流程更加灵活和可控。
|
存储 负载均衡 Linux
FastDFS介绍-1
FastDFS介绍
300 1
|
安全 数据库
【Debian】配置aide入侵检测服务
基于debian系统。aide主要功能检测系统文件,当系统文件发生变化,如/etc/passwd文件出现差异,那么aide将会认为系统遭受入侵被增添用户
2403 0
|
消息中间件 Linux
RabbitMq 安装部署
RabbitMq 安装部署
|
数据采集 Web App开发 数据可视化
Python爬取猫眼电影专业评分数据中的应用案例
Python爬取猫眼电影专业评分数据中的应用案例
使用T0,方式2,在P1.0输出周期为400µs,占空比为4:1的矩形脉冲,要求在P1.0引脚接有虚拟示波器,观察P1.0引脚输出的矩形脉冲波形
使用T0,方式2,在P1.0输出周期为400µs,占空比为4:1的矩形脉冲,要求在P1.0引脚接有虚拟示波器,观察P1.0引脚输出的矩形脉冲波形
|
数据可视化 BI
Quick BI 实战营北京首场顺利收官,杭州场免费名额预约中
Quick BI 实战营北京首场顺利收官,杭州场免费名额预约中
110 0