当前位置: 首页 > article >正文

算法——python实现堆排序

文章目录

      • 堆排序
        • 二叉树
        • 堆排序的过程:
        • 代码实现
        • python中的heapq模块

堆排序

二叉树

关于二叉树的操作,其实核心就是 父节点找子节点,子节点找父节点

如果要将二叉树存储到队列中,就需要找出 父子节点之间的规律:

  • 父找子: 2i+1(父与左) ,2i+2(父与右)
  • 子找父:(i-1)//2

在这里插入图片描述

完全二叉树

在这里插入图片描述

在这里插入图片描述

构造堆:从最后一个非叶子节点开始调整

堆排序的过程:

在这里插入图片描述

代码实现
"""
堆排序
"""

"""
时间复杂度 :               O(N*logN)
每次调整的时候:要么走左边要么走右边,每次只会走一个树的高度(logN)
"""


def sift(li, low, high):
    """
    调整函数,无论是构建堆还是移动堆都需要这个调整函数
    :param low: 根节点
    :param high: 堆最后一个元素的位置
    :return:
    """
    """
    1. 先把根节点拿出来
    2. 比较左右节点大小,选择替换
    3. 将拿出来的根节点放到合适位置
    """
    i = low  # i最开始指向根节点
    j = 2 * i + 1  # j开始是左孩子
    tmp = li[low]  # 把堆顶存起来
    while j <= high:  # 只要j位置有数
        if j + 1 <= high and li[j + 1] > li[j]:  # 如果右孩子有并且比较大
            j = j + 1  # j指向右孩子
        if li[j] > tmp:
            li[i] = li[j]
            i = j  # 往下看一层
            j = 2 * i + 1
        else:  # tmp更大,把tmp放到i的位置上
            li[i] = tmp  # 把tmp放到某一级领导位置上
            break
    else:
        li[i] = tmp  # 把tmp放到叶子节点上


def heap_sort(li):
    """
    1. 构建大根堆
    2. 调整堆为完全二叉树
    3.
    """
    n = len(li)
    for i in range((n - 1 - 1) // 2, -1, -1):
        """
        i: 构建大根堆的时候调整部分跟的下标(构建堆的过程是从最后一个非叶子节点开始的)
        建堆过程(构建一个大根堆)
        """
        sift(li, i, n - 1)
    for i in range(n - 1, -1, -1):
        # i永远指向堆的最后一个元素,堆空间每次减一给已经排好位置的腾出空间
        li[0], li[i] = li[i], li[0]  # 把最大的元素放到原来最后一位
        sift(li, 0, i - 1)  # 将堆空间每次减一,排序



li = [i for i in range(100)]
import random

random.shuffle(li)
print(li)

heap_sort(li)
print(li)
python中的heapq模块

python有一个内置的推排序模块,(在构建堆的时候,构建的是小根堆)

import random
import heapq

li = [random.randint(1, 101) for i in range(10)]
print(li)
heapq.heapify(li)  # 建堆(小根堆)
for i in range(len(li)):
    tmp = heapq.heappop(li)  # 弹出一个最小元素

若有错误与不足请指出,关注DPT一起进步吧!!!


http://www.kler.cn/a/355293.html

相关文章:

  • jumpserver docker安装
  • FlaskAPI-初识
  • 探索数据采集
  • 横向项目三模态融合笔记
  • 基于谱聚类的多模态多目标浣熊优化算法(MMOCOA-SC)求解ZDT1-ZDT4,ZDT6和工程应用--盘式制动器优化,MATLAB代码
  • 数字IC后端设计实现十大精华主题分享
  • leetcode 47.全排列||
  • Flink简介及小案例
  • SpringBoot框架下购物推荐网站的设计模式与实现
  • 网络资源模板--Android Studio 实现简易新闻App
  • 10.15.2024刷华为OD C题型(二)
  • 怎么一键下载网页所有图片?3个方法轻松搞定
  • 论文笔记:D-vlog 用于抑郁症检测的多模态数据集
  • 智慧园区能带来哪些便利?
  • 基于SpringBoot+Vue+uniapp微信小程序的婚庆摄影小程序的详细设计和实现(源码+lw+部署文档+讲解等)
  • CentOS 7- 配置阿里镜像源
  • HTML_文本标签
  • MySQL【知识改变命运】05
  • 计数型信号量
  • 【C语言】函数指针
  • 什么是ERP?快速理解ERP系统与ERP软件的区别
  • Python 数值计算与数值分析基础
  • 拿到snp的rawdata后如何使用GATK进行筛选(GATK硬筛选文档翻译)
  • 基于BERT的语义分析实现(论文复现)
  • 51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】
  • PCL 点云配准-4PCS算法(粗配准)