堆排序;大顶堆、小顶堆

news2024/11/18 11:43:12

堆排序

基本介绍

堆排序基本思想

堆排序步骤图解

在第二个步骤中,将节点6和它的两个左右节点比较大小,发现右节点最大,所以将节点6和节点9进行交换,如图所示,数组相应位置的值也交换

总结

代码实现

""" 堆排序 """
class HeapSort:
    def __init__(self, arr):
        self.arr = arr

    def adjust_heap(self, i: int, n: int):
        """
        arr[i] 对应一个非叶子节点,
        adjust_heap()方法的作用就是将arr[i]这个非叶子节点下的所有子树构建成大顶堆
        即从该非叶子节点开始,它下面的子树都满足大顶堆的定义
        如图中的第一个非叶子节点arr[1] = 6,其对应的子树如下,构建之后变为如下
                6                       9
                            =>
            5       9               5       6
        arr=[4,6,8,5,9], i=1 => adjust_heap() => 构建之后得到arr=[4,9,8,5,6]
        下一次再调用adjust_heap():
        arr=[4,9,8,5,6], i=0 => adjust_heap() => 构建之后得到arr=[9,6,8,5,4]
        adjust_heap()是将非叶子节点对应的
        :param i: 表示非叶子节点在数组中的索引
        :param n: 表示构建大顶堆时的元素个数(即要对多少个元素进行构建大顶堆),m是逐渐减少的
        :return:
        """
        temp = self.arr[i]  # 保存非叶子节点的值
        k = 2 * i + 1  # k 为叶子结点的左子节点
        while k < n:
            # k + 1 = 2 * i + 1 + 1 = 2 * i + 2,即表示右子节点
            # self.arr[k]表示左子节点的值,self.arr[k+1]表示右子节点的值
            if k + 1 < n and self.arr[k] < self.arr[k + 1]:
                # 如果左子节点小于右子节点的值,让 k 指向右子节点
                k += 1  # => k = 2 * i + 2
            if self.arr[k] > temp:  # 如果子节点(左/右子节点)大于父节点(非叶子结点)
                self.arr[i] = self.arr[k]  # 把较大的值赋值给当前节点
                i = k  # 让 i 指向 k 的位置
            else:
                break
            k = k * 2 + 1  # 下一个左子节点,即左子节点的左子节点
        # 当循环结束后,已经在局部将以 i 为父节点的树的最大值放在了堆顶
        self.arr[i] = temp  # 将 temp 值放到调整后的位置
        """
        以上代码请结合图来理解!!!
        """

    def heap_sort(self):
        """
        讲一个数组(该数组是二叉树顺序存储之后的数组)构建为大顶堆
        :return:
        """
        print("=======堆排序=======")
        print("排序前的数组:", self.arr)
        # self.adjust_heap(1, len(self.arr))
        # print("第一次调整后的数组:", self.arr)  # [4, 9, 8, 5, 6]
        # self.adjust_heap(0, len(self.arr))
        # print("第二次调整后的数组:", self.arr)  # [9, 6, 8, 5, 4]

        n = len(self.arr)
        # 将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆
        i = n // 2 - 1  # 从第一个非叶子节点开始进行调整,即从左往右,从下往上进行
        while i >= 0:
            self.adjust_heap(i, n)
            i -= 1
        # 将堆顶元素与数组末尾元素交换,将最大元素“沉”到数组末尾
        # 重新调整堆结构,使其满足大顶堆或小顶堆的定义,然后继续交换堆顶元素与数组末尾元素
        # 反复执行直到整个序列有序
        j = n - 1
        while j > 0:
            # self.arr[0]为堆顶元素,self.arr[j]为数组末尾元素,将其交换
            temp = self.arr[j]
            self.arr[j] = self.arr[0]
            self.arr[0] = temp
            # 交换后重新调整堆结构,0表示从根节点开始,将整棵树进行调整
            self.adjust_heap(0, j)
            j -= 1

        print("排序后的数组:", self.arr)



heap_sort = HeapSort([4, 6, 8, 5, 9])
heap_sort.heap_sort()

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

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

相关文章

Ubuntu 17.10的超震撼声音权限

从GNOME GUADEC 2017开发者大会归来之后&#xff0c;Canonical的Didier Roche就开始了一个日更博客系列&#xff0c;主要讲述即将带来的Ubuntu 17.10&#xff08;Artful Aardvark&#xff09;发行版将如何从Unity到GNOME Shell的转变。有趣的是&#xff0c;Ubuntu Unity桌面环境…

c语言练习91:合并两个有序链表

合并两个有序链表 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码1&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct Li…

基于springboot实现学生综合成绩测评系统项目【项目源码】

基于springboot实现学生合成绩测评系统演示 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的springboot框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个学生综合测评系统。 SpringBoot框架 SpringBo…

操作系统【OS】多线程模型

多对一模型 一对一模型 多对多模型 定义 多个ULT映射到一个KLT 每个ULT映射到一个KLT n个ULT映射到m个KLT&#xff0c; n≥m 优点 线程管理在用户空间进行&#xff0c;效率高 一个线程被阻塞&#xff0c;运行调度另一个线程运行&#xff0c;并发能力强 克服了多对一模型…

redis - 实现周期性数据无上报检测

需求背景 以小时为周期不停地上报事件到事件平台,事件平台如果在连续2个周期 没有检测到上报的事件,就会发送告警给事件的相关责任人. 问题的难点在于如何检测连续周期内无数据? 如上图,2 点和 3 点,都没有上报数据,说明连续两个周期存在无数据上报. 解决方案 本文采用 re…

专访 Web3Go 新产品 Reiki:培育 AI 原生数字资产与创意新土壤

从 DeFi 到 NFTFi、SocialFi&#xff0c;web3 从业者在尝试 crypto 与区块链技术能为我们的生活、创作、娱乐和文化带来何种新体验&#xff0c;而生成式人工智能的突破性发展则为我们与链上世界的交互、社区内容创作等带来了新的体验&#xff0c;改变互动、交易和价值创造方式。…

C++入门——引用|内联函数|auto关键字|基于范围的for循环|指针空值

前言 C入门专栏是为了补充C的不足&#xff0c;并为后面学习类和对象打基础。在前面我们已经讲解了命名空间、输入输出、缺省参数、重载函数等&#xff0c;今天我们将完结C的入门。 下面开始我们的学习吧&#xff01; 一、引用 1、引用是什么呢&#xff1f;为什么C添加了引用&a…

数据结构---HashMap和HashSet

HashMap和HashSet都是存储在哈希桶之中&#xff0c;我们可以先了解一些哈希桶是什么。 像这样&#xff0c;一个数组数组的每个节点带着一个链表&#xff0c;数据就存放在链表结点当中。哈希桶插入/删除/查找节点的时间复杂度是O(1) map代表存入一个key值&#xff0c;一个val值…

原型与原型链

一、原型&#xff1a;prototype 1.什么是原型&#xff1f; javascript常被描述为一种基于原型的语言&#xff08;每个对象都拥有一个原型对象&#xff09; 当访问一个对象的属性时&#xff0c;它不仅在该对象上寻找&#xff0c;还会寻找该对象的原型&#xff0c;以及该对象原…

【Java】人工智能交互智慧导诊系统源码

随着人工智能技术的快速发展&#xff0c;语音识别与自然语言理解技术的成熟应用&#xff0c;基于人工智能的智慧导诊导医逐渐出现在患者的生活视角中&#xff0c;智能导诊系统应用到医院就医场景中&#xff0c;为患者提供导诊、信息查询等服务&#xff0c;符合智慧医院建设的需…

Java利用反射和读取xml实现迷你容器

由于需要框架能实现多态&#xff0c;达到控制反转解耦。所以容器还是需要的&#xff0c;容器的存在可以简化对象获取工作&#xff0c;但是容器也不是万能的。合理使用即可&#xff0c;Spring对我来说太庞大了&#xff0c;用不着&#xff0c;为此给框架写一个迷你版容器。 容器…

Netty的高性能基石ByteBuf

前言 ​ NIO中缓冲区是数据传输的基础&#xff0c;JDK通过ByteBuffer实现&#xff0c;Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf。 ​ Netty中的ByteBuf对ByteBuffer做了大量的优化&#xff0c;比如说内存池&#xff0c;零拷贝&#xff0c;引用计数&#xf…

QFileDialog 文件对话框

文章目录 1、简介2、公共类型3、属性4、functions1、访问属性相关 function2、静态公共成员1、 通过对话框获取用户选择的文件路径&#xff1a;QFileDialog::getOpenFileName2、 通过对话框获取用户选择的文件夹路径&#xff1a;QFileDialog::getExistingDirectory 3、Public F…

家庭资产配置

不同家庭的资产配置 理财就是理人生 为人生的每件事&#xff0c;准备好相应的钱 生存的事 生活费 假设我们今年30岁&#xff0c;则至60岁期间所需的日常生活开支为&#xff1a; 4000元/月X 12月X30年144万 养老的事 养老费 吃饭居住娱乐其他开销60至80岁期间所需的养老…

用Wokwi仿真ESP-IDF项目

陈拓 2023/10/21-2023/10/21 1. 概述 Wokwi是一个在线的电子电路仿真器。你可以使用它来仿真Arduino、ESP32、STM32和许多其他流行的电路板、元器件以及传感器&#xff0c;免去使用开发板。 Wokwi提供基于浏览器的界面&#xff0c;您可以通过这种简单直观的方式快速开发一个…

农产品农货经营小程序商城的作用是什么

农产品行业涵盖的产品很多&#xff0c;以小麦、稻子、玉米、高粱等为主&#xff0c;还有粮油、果蔬、畜牧等产品。 自建技术团队&#xff0c;耗时耗力&#xff0c;培养成本较高&#xff0c;销售渠道单一、等客上门、产品无法高效宣传及促进用户购买&#xff0c;营销力不足&…

会声会影2023官方破解版激活码

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。功能最全的2023新版&#xff0c;全新视差转…

JavaWeb学生管理系统(详细源码+解析)

​ 很多人大学的第一个小项目就是使用JavaWeb实现了一个学生管理系统或者是图书管理系统。在没有项目经验的情况下&#xff0c;前后端都需要自己去完成&#xff0c;还是要耗费不少时间精力的。本次我就分享一下我在大学期间完成的第一个小项目&#xff1a;学生管理系统。采用的…

2023年【司钻(钻井)】及司钻(钻井)作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 司钻&#xff08;钻井&#xff09;是安全生产模拟考试一点通生成的&#xff0c;司钻&#xff08;钻井&#xff09;证模拟考试题库是根据司钻&#xff08;钻井&#xff09;最新版教材汇编出司钻&#xff08;钻井&#…

Tuxera NTFS2023破解版苹果电脑磁盘读写工具

当您获得一台新 Mac 时&#xff0c;它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac&#xff0c;您需要一个附加的 NTFS 驱动程序。Tuxera 的 Microsoft NTFS for Mac 是一款易于使用的软件&#xff0c;可以在 Mac 上打开、编辑、复制、移动或删…