完全二叉树和堆排序

news2024/11/20 9:13:01

完全二叉树 

完全二叉树满足以下两个条件:

  1. 所有层的节点都完全填满:除了最后一层外,每一层的节点数都是最大节点数,即除了最后一层,其他层的节点数都是满的。

  2. 最后一层的节点尽可能地向左排列:在满足第一个条件的前提下,最后一层的节点从左到右填充,没有空隙。

完全二叉树的性质包括:

  • 高度:完全二叉树的高度通常用 h 表示,对于有 n 个节点的完全二叉树,其高度 h 满足 h=⌊log⁡2n⌋+1

  • 节点数:对于高度为 h 的完全二叉树,其节点总数 n 满足2^(h−1)≤n<2^h

  • 叶子节点:在高度为 h 的完全二叉树中,叶子节点的数量最多为 2^(h−1),最少为 1(当 h = 1 时)。

  • 数组表示:完全二叉树可以用数组来表示,其中第 i 个节点(假设根节点为 1)的左子节点为 2i,右子节点为 2i+1,父节点为 ⌊i/2⌋。

  • 满二叉树:如果一个完全二叉树的所有层都完全填满,那么它就是一个满二叉树(Full Binary Tree)。

  • 二叉堆:完全二叉树常用于实现二叉堆(Binary Heap),二叉堆是一种特殊的完全二叉树,它满足堆的性质,即任意节点的值总是不大于(或不小于)其子节点的值。

二叉堆 

二叉堆是一种特殊的二叉树,也是最常见的堆结构,它有两种类型:

  1. 最大堆(Max Heap):在最大堆中,每个节点的值都 >= 其子节点的值。在最大堆的根节点存储着整个堆中的最大值。

  2. 最小堆(Min Heap):在最小堆中,每个节点的值都 <= 于其子节点的值。在最小堆的根节点存储着整个堆中的最小值。

101d54c6f47e46cf8ca976886f907477.png

堆排序

堆排序(Heap Sort)是一种基于二叉堆数据结构的选择排序算法。它利用堆这种数据结构的特性来对数据进行排序,可以是最大堆或最小堆。

以下是堆排序代码,一开始是建立大根堆,来实现升序排序

堆的建立代码如下

 // 堆排序
    // 建立堆
    public static void BuiltMaxHeap(int arr[], int len){
        for(int i = len >> 1; i > 0; i--){ // 从最后一个有孩子节点的节点开始
            HeadAdjust(arr, i, len);
        }
    }

    // 调整堆
    // num:调整根节点索引值为num的堆;调整的子树的起始位置
    // len:整个堆中元素的个数;调整子树的终止位置
    public static void HeadAdjust(int arr[], int num, int len){
        for (int i = num << 1; i <= len; i *= 2){
            if (i + 1 <= len && arr[i + 1] > arr[i]){
                i++;
            } // 找到孩子节点中最大的节点的索引值i
            if (arr[num] < arr[i]) { // 这里是基于交换来实现小元素的下坠
                arr[0] = arr[i];
                arr[i] = arr[num];
                arr[num] = arr[0];
            } else {
                break;
            }
            num = i;
        }
    }

如果要基于元素移动并覆盖的方式来调整堆,那么这种调整方法如下

 public static void HeadAdjust(int arr[], int num, int len){
        arr[0] = arr[num];
        for (int i = num << 1; i <= len; i *= 2){
            if (i + 1 <= len && arr[i + 1] > arr[i]){
                i++;
            } // 找到孩子节点中最大的节点的索引值i
            if (arr[0] < arr[i]) {
                arr[num] = arr[i];
            } else {
                break;
            }
            num = i;
        }
        // 这里是基于移动覆盖元素来实现小元素的下坠
        arr[num] = arr[0]; // 移动覆盖元素方法一般都是在循环覆盖完元素后给指定位置赋值
    }

 开始排序

public static void HeapSort(int arr[], int len) {
        BuiltMaxHeap(arr, len); // 建立一个堆
        for (int i = len; i > 1; i--) { // 之后不断将堆的第一个元素与最后的元素交换位置
            arr[0] = arr[1];
            arr[1] = arr[i];
            arr[i] = arr[0];
            HeadAdjust(arr, 1, i - 1); // 交换完位置后调整堆
        }
    }

 堆排序时间空间复杂度及稳定性分析

建堆的时间复杂度为:O(n);

排序的时间复杂度:O(n log2 n);

总的时间复杂度:O(n log2 n);

稳定性:不稳定

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

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

相关文章

调试技巧 conso.trace()

console 的 trace() 方法向 Web 控制台输出一个堆栈跟踪。 trace是一个很好的调试错误的办法&#xff0c; console.trace() 方法用于显示当前执行的代码在堆栈中的调用路径。 可以查看函数在哪一些地方做了调用 这个在找不出变量在何处被修改的时候&#xff0c;很有用 同时…

TCP网络编程概述、相关函数、及实现超详解

文章目录 TCP网络编程概述1. TCP协议的特点2. TCP与UDP的差异3. TCP编程流程 TCP网络编程相关函数详解1. socket()&#xff1a;创建套接字参数说明&#xff1a;返回值&#xff1a;示例&#xff1a; 2. connect()&#xff1a;客户端连接服务器参数说明&#xff1a;返回值&#x…

力扣每日一题 公司命名 集合 找规律

Problem: 2306. 公司命名 &#x1f468;‍&#x1f3eb; 灵神题解 class Solution {public long distinctNames(String[] ideas) {// 创建一个大小为26的HashSet数组&#xff0c;用于存储每个首字母对应的字符串集合Set<String>[] groups new HashSet[26];Arrays.set…

基于Python大数据的音乐推荐及数据分析可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Cadence Allegro17.4 板框倒角

一、Cadence Allegro 板框倒角有倒斜角和倒圆角两种形式&#xff1a; 1、 板框倒斜角 2、 板框倒圆角 二、有些时候不能倒角 如果我们绘制的板框是Shape属性的是不能正常倒角设置&#xff0c;要将Shape属性的板框更改为lines属性的板框。 1、 选择菜单栏Shape——Decompose …

Wireshark_流量分析

在当今数字化的时代&#xff0c;网络流量分析对于确保网络的稳定运行、排查故障以及保障网络安全至关重要。Wireshark 作为一款功能强大的网络数据包分析工具&#xff0c;为我们提供了多种实用的功能&#xff0c;帮助我们深入了解网络中的数据传输情况。 1、数据包筛选 数据包…

HTTP和HTTPS的区别,HTTP协议转HTTPS协议测试需要注意内容

简单快捷&#xff1a;HTTP 相对于 HTTPS 更简单和快速。在开发过程中&#xff0c;可能频繁地修改代码并测试&#xff0c;使用 HTTP 可以减少一些开发中的额外步骤和复杂性。 不涉及敏感信息&#xff1a;在本地开发环境中&#xff0c;通常不涉及真实用户数据或敏感信息的传输&a…

单链表实现和数组模拟单链表

现在有一个排好序的若干个元素(升序),现在要插入一个元素啊&#xff0c;请你输入插入该元素后的序列(升序) 请分别用单链表实现&#xff0c;和数组模拟单链表实现 为什么要用数组模拟单链表 1.内存局部性&#xff1a;数组在内存中是连续存储的&#xff0c;因此在访问元素时可…

了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 随着自然语言处理&#xff08;NLP&#xff09;技术的飞速进步&#xff0c;基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构&#xff0c;如 GPT 系列模型&…

“警警”有条:zCloud告警中心的告警与处置实践

ENMOTECH 随着金融行业数字化转型步伐的加快&#xff0c;海量数据处理成为常态&#xff0c;而作为数据存储和管理的核心——数据库的稳定性与效率直接影响着企业的运营成效。某金融科技企业使用了近10个品类、300余套数据库来承载业务&#xff0c;在专业运维、集中管理等方面都…

【操作系统】速成3

Linux内核和windows内核 原来鸿蒙是微内核 windows混合内核 参考&#xff1a;xiaolincoding.com

5种强大的方式:AI在临终关怀中提升护理质量,改善生活

目录 什么是临终关怀中的AI&#xff1f;AI如何个性化临终关怀&#xff1f;AI如何改善临终关怀患者的生活质量&#xff1f; 疼痛管理症状管理的预测分析情感和心理支持高效的资源分配减轻家庭压力 临终关怀中AI的未来 近年来&#xff0c;医疗保健行业在人工智能&#xff08;AI…

MySQL --事务(上)

文章目录 1.什么是事务1.1为什么会出现事务1.2 事务的版本支持1.3 事务提交方式1.4事务常见操作方式1.4.1正常演示 - 证明事务的开始与回滚1.4.2非正常演示1 - 证明未commit&#xff0c;客户端崩溃&#xff0c;MySQL自动会回滚&#xff08;隔离级别设置为读未提交&#xff09;1…

Ubuntu环境切换到服务器某个用户后source等命令和Tab快捷补全都用不了了,提示没找到,但root用户可以

以escs用户为例&#xff1a; 输入以下命令 grep root /etc/passwd grep escs /etc/passwd 对比发现&#xff0c;root用户配的是bash&#xff0c;而escs却是sh&#xff0c; 所以把escs的sh改成和root一样的bash&#xff0c;命令为 usermod -s /bin/bash escs 改好后就可以了。 …

Win11 安装 PostgreSQL 数据库,两种方式详细步骤

文章目录 一、exe文件安装 &#xff08;推荐&#xff09;下载安装包1. 选择操作系统2. 跳转到EDB&#xff08;PostgreSQL 的安装包托管在 EDB上&#xff09;3. 选择版本点击下载按钮 安装1. 管理员打开安装包2. 选择安装目录3. 勾选安装项4. 设置数据存储目录5. 设置管理员密码…

C语言线程编程深度解析

文章目录 前言一、线程基础概念1. 什么是线程&#xff1f;2. 线程与进程的区别 二、POSIX线程库&#xff08;pthread&#xff09;1. pthread简介2. 编译与链接3. 创建线程示例代码&#xff1a; 4. 线程同步互斥锁&#xff08;Mutex&#xff09;示例代码&#xff1a; 条件变量&a…

SpringBoot代码实战(MyBatis-Plus+Thymeleaf)

构建项目 修改pom.xml文件&#xff0c;添加其他依赖以及设置 <!--MyBatis-Plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.6</version><…

智源研究院与百度达成战略合作 共建AI产研协同生态

2024年9月24日&#xff0c;北京智源人工智能研究院&#xff08;简称“智源研究院”&#xff09;与北京百度网讯科技有限公司&#xff08;简称“百度”&#xff09;正式签署战略合作协议&#xff0c;双方将充分发挥互补优势&#xff0c;在大模型等领域展开深度合作&#xff0c;共…

共享打印机无法创建打印作业原因分析及解决方法

在日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;有时在添加打印机的过程中&#xff0c;经常会遇各种问题。今天有个小伙伴问我在访问共享打印机时提示“无法创建打印作业”怎么回事&#xff1f;今天小编就教大家共享打印机无法创建打印作业原因分…

多表查询。

一、多表查询 select * from 表名,表名; select * from 表名,表名 where 条件; 二、内连接 隐式 select 字段列表 from 表1,表2 where 条件; 显示 select 字段列表 from 表1 INNER JOIN 表2 on 条件; 三、外连接 1.左外连接 select 字段列表 from 表1 left [outer] join 表…