二叉树--堆排序

我们之前学过冒泡排序算法,还有其他的排序算法之类的,我们今天来讲堆排序算法;

假设我们现在有一个数组,我们想要对其进行排序,我们可以使用冒泡排序来进行排序;我们也可以使用堆排序来进行排序;

我们之前说过堆的数据结构;当我们拥有堆的数据结构的时候,我们可以使用我们的数组,在我们的堆在进行初始化的时候,我们可以把我们的数组里面的数据传进去,把数据导入到我们的堆里面,然后使用我们的堆的数据结构,我们不断的取堆顶的数据,然后向下排序,把堆顶的数据放到最后面,然后向下排序,这样不断地进行,直到我们的堆变成顺序的了;然后我们把它打印出来。

但是这样的话,我们其实没有改变数组,我们的数组还是原来的数据;我们就可以不断地取堆顶,然后把堆顶的数据销毁,然后,因为我们的出堆函数里面是含有把堆二叉树重新的向下调整的,所以,下次他就还是一个新的完好的堆二叉树;我们可以把输出的数据保存下来,保存到数组里面去

我们只是把数组里面的数据导入到我们的堆里面,然后使用堆的数据结构来进行操作,因为我们把数据插入到我们的堆二叉树里面的时候,我们的堆里面他就含有着向上调整的方法;所以我们把数据插入完后他就是一个堆二叉树;但是其实,当我们想要完成堆排序的时候,我们其实是不需要这个堆的数据结构的,这样未免太麻烦了;

这时候我们就开始我们的真正的堆排序;

我们所说的堆排序其实是使用堆的思想,并不调用堆的结构;堆的底层就是数组,我们把我们要改变的数组拿过来在使用向下调整的方式把他改变为堆的形式;然后把

1.构建堆。

我们从非叶子节点的最后一个结点开始,我们对其进行向下调整,一直到根节点,这样最后就成功地构建了一个堆结构; 至于是大根堆还是小根堆的话,我们就看向下调整里面的了

2.排序。

构建好堆以后我们把堆的第一个元素和最后一个元素进行交换;,然后我们把堆的有效的数据-1;然后,就和出堆一样,我们进行向下调整;我们不断的重复这个操作,直到最后,我们的最里面的有效数据只有一个了;

我们来实现一下堆排序:

//在我们开始堆排序的学习之前,我们要先说明:
//那就是我们的堆排序其实是不能使用堆的数据结构的,我们使用的是堆的思想;
//我们选择不调用堆的结构;
//堆的底层就是数组,我们就把传过来的数组,变成堆得形式;

void swap(int* x, int* y)
{
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

//向上调整(入堆)
void Adjustup(int* arr, int child)
{
    //我们要进行向上调整,我们可以根据孩子把父亲求出来
    int parent = (child - 1) / 2;
    //向上调整既可以是大堆,也可以是小堆;

    while (child > 0)
    {
        //如果要求是小堆的时候,我们看谁小,我们就把谁往上放,
        //所以小堆:<
        //如果孩子比父亲小我们就交换
        //大堆:>
        //如果孩子比父亲大我们就交换
        if (arr[child] < arr[parent])
        {
            swap(&arr[child], &arr[parent]);
        }
        else
        {
            break;
        }
        child = parent;
        parent = (child - 1) / 2;
    }
}

//向下调整法(出堆)
void AdjustDown(int* arr, int parent, int n)
{
    int child = 2 * parent + 1;//左孩子;

    while (child < n)
    {
        //大堆:<
        //大堆的话我们找到大孩子
        //小堆:>
        //小堆我们就找小孩子
        if (child + 1 < n && arr[child] < arr[child + 1])
        {
            child++;
        }

        //大堆  >
        //我们找到大的放上去
        //小堆  <
        //我们找到小的放上去
        if (arr[child] > arr[parent])
        {
            swap(&arr[child], &arr[parent]);
            parent = child;
            child = 2 * parent + 1;
        }
        else
        {
            break;
        }
    }
}

//我们的向上和向下调整法的参数都不是我们的堆,这样就很好,所以我们就不需要建堆;可以拿来直接使用


void HeapSort(int* arr, int n)
{
    for (int i = (n - 2) / 2; i >= 0; i--)
    {
        //从这个第一个子树的根节点开始,我们从右往左的依次进行;对其进行向下调整
        AdjustDown(arr, i, n);//n就是表示有效的的数据个数;
    }
    //这样建堆就完成了
    //堆排序---现在的堆还是乱序的,我们来对其进行排列; 
    int end = n - 1;
    //我们让end为最后一个结点的下标;
    while (end > 0)
    {
        swap(&arr[0], &arr[end]);
        //让开始和最后的进行了交换,然后我们进行向下调整;这就和出堆一样,
        //我们把堆顶的数据和最后一个结点的数据进行交换,然后再进行向下调整;//这时候除了堆顶的数据是乱的,其他的都是
        //正常的堆,所以这时候我们就可以进行向下调整;
        AdjustDown(arr, 0, end);
        //这里我们的父节点一直都是0,这个可以不用改变,最后的参数end表示的是有效的数据的个数;
        //我们开始直接吧end传过去,这就是较少了一个有效的数据的个数;
        end--;
    }
}


#include<stdio.h>
int main()
{
    //我们的方法是,找寻最后一个子树的根节点;这就是我们的初始的值
    //我们就是先把一边的子树进行向下调整,然后对另一边的子树也进行向下的调整
    //然后我们对整体的根节点进行向下调整;这就可以求出来;
    int arr[] = {12,24,434,54,65,76,76,34};
    int a = sizeof(arr) / sizeof(int);
    HeapSort(arr, a);
    for (int i = 0; i < a; i++)
    {
        printf("%d ", arr[i]);
    }


    return 0;
}
 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简述mysql 主从复制原理及其工作过程,配置一主两从并验证

第一种基于binlog的主从同步 首先对主库进行配置&#xff1a; [rootopenEuler-1 ~]# vim /etc/my.cnf 启动服务 [rootopenEuler-1 ~]# systemctl enable --now mysqld 主库的配置 从库的配置 第一个从库 [rootopenEuler-1 ~]# vim /etc/my.cnf [rootopenEuler-1 ~]# sys…

【技术总结类】2024,一场关于海量数据治理以及合理建模的系列写作

目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线&#xff0c;也是2025要继续的主线 1.今年的创作路线 今年的写作内…

用于牙科的多任务视频增强

Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上&#xff0c;这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…

Hnu电子电路实验2

目录 【说明】 与本次实验相关的代码及报告等文件见以下链接&#xff1a; 一、实验目的 二、实验内容 三&#xff1a;实验原理 1.指令译码器 2.AU 算术单元 四&#xff1a;实验过程 1.指令译码器 A&#xff09;创建工程&#xff08;选择的芯片为 familyCyclone II&am…

C语言之图像文件的属性

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 图像文件属性提取系统设计与实现 目录 设计题目设计内容系统分析总体设计详细设计程序实现…

AI 新动态:技术突破与应用拓展

目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最具影响力的领域之一。AI 技…

ElasticSearch DSL查询之排序和分页

一、排序功能 1. 默认排序 在 Elasticsearch 中&#xff0c;默认情况下&#xff0c;查询结果是根据 相关度 评分&#xff08;score&#xff09;进行排序的。我们之前已经了解过&#xff0c;相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。…

【NLP基础】Word2Vec 中 CBOW 指什么?

【NLP基础】Word2Vec 中 CBOW 指什么&#xff1f; 重要性&#xff1a;★★ CBOW 模型是根据上下文预测目标词的神经网络&#xff08;“目标词”是指中间的单词&#xff0c;它周围的单词是“上下文”&#xff09;。通过训练这个 CBOW 模型&#xff0c;使其能尽可能地进行正确的…

资料03:【TODOS案例】微信小程序开发bilibili

样式 抽象数据类型 页面数据绑定 事件传参

vim文本编辑器

vim命令的使用&#xff1a; [rootxxx ~]# touch aa.txt #首先创建一个文件 [rootxxx ~]# vim aa.txt #vim进入文件aa.txt进行编辑 vim是vi的升级版&#xff0c;具有以下三种基本模式&#xff1a; 输入模式(编辑模式) 点击i进入编辑模式 &#xff08;说明…

(undone) 并行计算学习 (Day2: 什么是 “伪共享” ?)

伪共享是什么&#xff1f; TODO: 这里补点文档&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 缓存一致性、同步的代价&#xff01;&#xff01;&#xff01; 也就是&#xff0c;当不同线程所访问的内存元素恰好在同一个 cache line 上时&#xf…

基于python的博客系统设计与实现

摘要&#xff1a;目前&#xff0c;对于信息的获取是十分的重要&#xff0c;我们要做到的不是裹足不前&#xff0c;而是应该主动获取和共享给所有人。博客系统就能够实现信息获取与分享的功能&#xff0c;博主在发表文章后&#xff0c;互联网上的其他用户便可以看到&#xff0c;…

使用插件SlideVerify实现滑块验证

作者gitee地址&#xff1a;https://gitee.com/monoplasty/vue-monoplasty-slide-verify 使用步骤&#xff1a; 1、安装插件 npm install --save vue-monoplasty-slide-verify 2、在main.js中进行配置 import SlideVerify from vue-monoplasty-slide-verify; Vue.use(SlideV…

【深度学习项目】语义分割-FCN网络(原理、网络架构、基于Pytorch实现FCN网络)

文章目录 介绍深度学习语义分割的关键特点主要架构和技术数据集和评价指标总结 FCN网络FCN 的特点FCN 的工作原理FCN 的变体和发展FCN 的网络结构FCN 的实现&#xff08;基于Pytorch&#xff09;1. 环境配置2. 文件结构3. 预训练权重下载地址4. 数据集&#xff0c;本例程使用的…

2024年博客之星主题创作|从零到一:我的技术成长与创作之路

2024年博客之星主题创作&#xff5c;从零到一&#xff1a;我的技术成长与创作之路 个人简介个人主页个人成就热门专栏 历程回顾初来CSDN&#xff1a;怀揣憧憬&#xff0c;开启创作之旅成长之路&#xff1a;从平凡到榜一的蜕变持续分享&#xff1a;打卡基地与成长复盘四年历程&a…

【整体介绍】

ODO&#xff1a;汽车总行驶里程 Chime: 例如安全带没系的报警声音 多屏交互就是中控屏的信息会同步到主驾驶的仪表盘上 面试问题&#xff1a;蓝牙电话协议HFP 音乐协议A2DP 三方通话测试的逻辑

PyTorch使用教程(13)-一文搞定模型的可视化和训练过程监控

一、简介 在现代深度学习的研究和开发中&#xff0c;模型的可视化和监控是不可或缺的一部分。PyTorch&#xff0c;作为一个流行的深度学习框架&#xff0c;通过其丰富的生态系统提供了多种工具来满足这一需求。其中&#xff0c;torch.utils.tensorboard 是一个强大的接口&…

2025寒假备战蓝桥杯01---朴素二分查找的学习

文章目录 1.暴力方法的引入2.暴力解法的思考 与改进3.朴素二分查找的引入4.朴素二分查找的流程5.朴素二分查找的细节6.朴素二分查找的题目 1.暴力方法的引入 对于下面的这个有序的数据元素的组合&#xff0c;我们的暴力解法就是挨个进行遍历操作&#xff0c;一直找到和我们的这…

Qt按钮美化教程

前言 Qt按钮美化主要有三种方式&#xff1a;QSS、属性和自绘 QSS 字体大小 font-size: 18px;文字颜色 color: white;背景颜色 background-color: rgb(10,88,163); 按钮边框 border: 2px solid rgb(114,188,51);文字对齐 text-align: left;左侧内边距 padding-left: 10…

ESP32下FreeRTOS实时操作系统使用

ESP32下FreeRTOS实时操作系统使用 文章目录 ESP32下FreeRTOS实时操作系统使用一、概述二、为什么要使用实时操作系统RTOS&#xff1f;三、FreeRTOS任务3.1 什么是 FreeRTOS 任务&#xff1f;3.2 FreeRTOS 任务的特点3.3 FreeRTOS 任务的生命周期3.4 FreeRTOS 任务的状态3.5 Fre…