堆的建立、插入、删除以及堆排序

堆的构建、堆的插入、堆的删除、堆排序 如果你不了解堆是如何构建、插入、删除、堆排序的原理,可以点击下面连接,有详细的图解,让你知道逻辑原理。 http://blog.youkuaiyun.com/u011068702/article/details/52712634 最详细的最小堆构建、插入、删除的过程图解 http://blog.youkuaiyun.com/u011068702/article/details/52767187堆排序 阅读详情

堆的结构为完全二叉树,因此适合用数组来存储,本文建立的是最小堆

代码如下:

/************************************************************************
*
* 文件名:5.1.1.cpp
*
* 文件描述:堆的建立、插入、删除以及堆排序
*
* 创建人:  fdk

* 时  间:  2018-08-11
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <time.h>
using namespace std;
int h[] = {99, 5, 36, 7, 22, 17, 46, 12, 2, 19, 25, 28, 1, 92};  //用来存放堆中元素的数组
int n;          // 堆的大小

/*交换函数用来交换堆中的两个元素的值*/
void Swap (int x, int y)
{
    int temp;
    temp = h[x];
    h[x] = h[y];
    h[y] = temp;
}

/*向下调整函数*/
void SiftDown(int i) //传入一个需要向下调整的结点i,当i为1时即为从堆顶开始向下调整
{
    int t;
    int flag = 0; //flag用来标记是否继续向下调整

    /*当i结点有儿子(其实是至少有左儿子)且需要继续调整的时候循环就执行*/
    while (i * 2 + 1 <= n && flag == 0)
    {
        //首先判断它和左儿子的关系,并用t来记录值较小的结点编号
        if (h[i] > h[i*2+1])
        {
            t = i * 2 + 1;
        }
        else
        {
            t = i;
        }
        /*如果它有右儿子,再对右儿子进行讨论*/
        if (i * 2 + 2 <= n)
        {
            //如果右儿子更小,则更新较小的结点编号
            if (h[t] > h[i*2+2])
            {
                t = i * 2 + 2;
            }
        }
        /*如果发现最小的结点不是自己,说明了子结点中有比父结点更小的*/
        if (t != i)
        {
            Swap(t, i);  //交换t和i
            i = t;       //更新i为刚才的与它交换的儿子结点的编号,便于接下来继续向下调整
        }
        else
        {
            flag = 1;    //否则则说明当前的父结点已经比两个子结点都要小了,不需要再进行调整了
        }
    }
}

/*建立堆函数*/
void Creat()
{
    int i;
    /*从最后一个非叶结点到第一个结点依次进行向下调整*/
    for (i = n / 2; i >= 0; i--)
    {
        SiftDown(i);
    }
}

int DeleteMax()
{
    int t;
    t = h[0];    //用一个临时变量记录堆栈的值
    h[0] = h[n]; //将堆的最后一个点复制到堆顶
    n--;         //堆的元素减少1
    SiftDown(0); //向下调整
    return t;    //返回之前记录的堆的顶点的最小值
}
int main()
{
    n = sizeof(h) / sizeof(h[0]) - 1;
    int num = n;
    cout << n << endl;
    cout << "排序前的序列为:";
    for (int i = 0; i <= num; i++)
    {
        cout << h[i] << " ";
    }
    cout << endl;

    cout << "建堆之后的序列为:";
    Creat();
    for (int i = 0; i <= num; i++)
    {
        cout << h[i] << " ";
    }
    cout << endl;

    cout << "排序后的序列:";
    for (int j = 0; j <= num; j++)
    {
        cout << DeleteMax() << " ";
    }
    cout << endl;
    return 0;
}

 

IMU、INS、GNSS与组合导航:从原理到工程实践全解析 在自动驾驶、无人机和机器人等智能系统的定位方案中,IMU、INS、GNSS和组合导航常被混为一谈,但它们在硬件层级、数据特性和误差机制上截然不同。IMU作为惯性测量单元,以百赫兹以上频率输出加速度和角速度;INS基于IMU完成姿态、速度与位置的递推解算,却因积分累积误差而随时间漂移;GNSS提供绝对位置,但易受遮挡和干扰。组合导航通过卡尔曼滤波将两者融合,实现短期不飘、长期不偏的连续定位,这正是高精度导航系统的技术底座。工程落地时,从IMU标定、Allan方差分析到相机/LiDAR与IMU外参标定,再到松耦 阅读详情

相关推荐

从翼型到湍流:用生活化案例图解空气动力学核心概念(中英双语版)

本文通过飞机机翼、F1赛车、高尔夫球等生活化案例,图解空气动力学核心概念。深入浅出地解释了攻角如何产生升力、边界层与流动分离如何影响阻力、马赫数如何划分速度世界,以及涡流与湍流的特性与应用。文章还介绍了计算流体动力学(CFD)这一现代数字风洞工具,帮助读者直观理解这些塑造现代交通与运动设计的无形之力。

metaverse5vr的博客 475

堆的相关操作(创建堆、插入、删除、堆排序、top-k问题)

一、什么是堆 堆得满足两个特性:1、首先得是一个完全二叉树 2、每个节点比其孩子节点都大(小),则其是大(小)堆。 堆是将其元素存储在一维数组中的。 二、堆的创建 1、首先了解堆向下调整算法: 向下调整算法有一个前提:左右子树必须得是一个堆。如图所示,只有根节点不满足堆的特性。 现在就来向下调整根节点,使其整体成为一个小堆。具体做法是让父节点和它较小的子节点交换(前提是左右节点都存在),然后再让父节点等于子节点;重复此操作...

weixin_62042704的博客 3547

步进电机选型避雷手册:为什么你的42HS电机总丢步?从相数、电流到散热全面拆解

本文深入剖析了42HS步进电机在高速或重载下易出现丢步问题的根本原因。文章指出,选型时不应仅关注静态保持转矩,而需重点分析动态矩频曲线、合理匹配驱动器电流与细分数、进行准确的机械传动惯量计算,并有效管理系统共振与散热。通过全面拆解这些关键因素,为工程师提供了实用的选型避雷指南与系统优化方案。

weixin_29275257的博客 97

二叉树的结构及实现——堆

堆的结构,实现及应用

qq_48042235的博客 708

LaTeX伪代码字体大小调整全攻略:从algorithm到algorithm2e的实战技巧

本文详细介绍了在LaTeX中调整伪代码字体大小的全面技巧,涵盖algorithm、algorithmicx和algorithm2e等主流算法包的使用方法。从基础命令到高级配置,帮助用户解决学术论文和技术文档中的伪代码排版问题,提升算法展示的专业性和可读性。特别针对不同期刊格式要求,提供了实用的字体调整方案。

weixin_29297127的博客 437

解密HDMI热插拔检测电路:从HPD引脚到EDID读取的全流程避坑

本文深入解析HDMI热插拔检测与EDID读取的全流程,从HPD引脚信号特性、DDC通道I2C协议到EDID数据结构,系统剖析了硬件电路设计、信号完整性和软件协议中的常见陷阱与解决方案,为消费电子设备开发者提供了一套完整的实战避坑指南。

weixin_29291069的博客 647

Day_48堆排序

堆排序

DARRENANJIAN的博客 717

通达信波段交易公式实战:如何用副图指标精准捕捉买卖点(附完整源码)

本文深入解析通达信波段交易副图指标的构建与应用,提供完整源码实现,帮助投资者精准捕捉买卖点。通过趋势强度度量、超买超卖判断及信号过滤机制,结合K线图分析,有效提升波段交易的成功率。

weixin_29306317的博客 606

【堆】建堆、插入、删除、堆排序

参考 堆就是利用数组来实现二叉树,可用于构建优先队列、堆排序、TopK问题等。可分为: 最大堆:父节点的值比其子节点大 最小堆:父节点的值比其子节点小 堆的根节点存放了最小(或最大)元素,但是其它节点的排序是未知的,即左节点不一定比右节点大(或小),堆的搜索相对于二叉搜索树更慢,二叉搜索树(如AVL)是平衡二叉树,搜索时间复杂度为O(nlogn),而堆的目的只是为了获得最大(或最小)元素,将其存储在头节点。 实现堆只需要一个顺序存储结构的数组,相对于二叉树而言,空间开销更低,二叉树还需要分配左右指针占用

这个人很蓝 593

基于Python的军事装备数据爬取与分析:从网页抓取到数据可视化实战

本文将详细介绍如何使用Python最新技术栈构建一个完整的军事装备数据爬虫系统。我们将从爬虫基础讲起,逐步深入到异步爬取、反反爬策略、数据存储与分析等高级主题,最终实现一个能够自动抓取、清洗、存储和分析军事装备数据的完整解决方案。文章包含大量实战代码示例,涉及requests-html、aiohttp、Playwright等现代爬虫库,以及MongoDB存储、Pandas分析和Pyecharts可视化等技术。关键词:Python爬虫、军事数据、异步爬取、反反爬、数据可视化。

2201_76125261的博客 1189

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

堆,建堆,堆排序,堆删除和堆插入

注意:看这篇文章之前,你一定要知道完全二叉树的结构首先要明白一点,堆是一种数据结构,和队列,链表,树等等一个级别。堆的定义堆是一棵节点含有内部比较器的完全二叉树。(说白了,堆就是完全二叉树,只不过它的节点对象实现了comparable接口)。堆的特性每个父节点都大于等于(或者小于等于)其所有后代结点。堆的根节点含有堆中最大(或者最小)的对象。堆中以任意节点为根节点的子树仍然是堆。堆的分类最大堆(大...

酒吧七的博客 2万+

基于深度学习的工业零件缺陷检测系统

工业零件缺陷检测系统摘要 本文介绍了一个基于深度学习的工业零件缺陷检测系统解决方案。该系统采用Faster R-CNN目标检测算法,结合PyTorch框架和OpenCV图像处理库,实现了对工业零件表面缺陷(如裂纹、划痕、凹坑等)的自动检测与定位。系统包含完整的开发流程:从数据采集与标注、数据增强预处理、模型构建与训练,到最终的评估与部署。相比传统机器视觉方法,该深度学习方案具有更强的特征表示能力和环境适应性,能够有效提升工业质检的准确率和效率。文章详细阐述了系统架构设计、实现细节和优化策略,并提供了完整的代

huanghm88的专栏 286

堆的建立、删除、插入操作以及堆排序

二叉堆是一种特殊的堆,二叉堆是完全二元树或者是近似完全二元树。 二叉堆有两种:最大堆和最小堆。 最大堆:父结点的键值总是大于或等于任何一个子节点的键值; 最小堆:父结点的键值总是小于或等于任何一个子节点的键值。 堆一般用数组存放:跟节点为0节点,i节点的左子节点为2*i+1,右子节点为2*i+2;   堆的操作: 建立、插入、删除   插入:因为从根节点到叶节点是一个有序序

jyshuestc的专栏 1204

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构堆(Heap)详解-堆的建立、插入、删除、最大堆、最小堆、堆排序等

基本概念: 1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。 2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值。 什么是堆? 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值; ...

SmallBottle-CGWLMX的博客 10万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

堆的插入、删除和建立操作,堆排序

1.        堆 堆:n个元素序列{k1,k2,...,ki,...,kn},当且仅当满足下列关系时称之为堆: (ki 或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4,...,n/2) 若将和此次序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点

“亚”人深致,不忘初“辛” 667

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数据结构堆排序中堆的建立、调整、插入、删除等操作的详解(题目讲解 简单易懂)

数据结构堆排序中堆的建立、调整、插入、删除等操作的详解(题目讲解 简单易懂)

showswoller的博客 3618

堆【最大堆】构建及其操作【数据结构笔记】

写在开头: 一般用数组来表示堆,i结点的父结点下标就为(i–1)/2。它的左右子结点下标分别为2i+1和2i+2。如第0个结点的左右子结点下标分别为1和2。 1、堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+...

NewDreamstyle的博客 1051

堆和堆排序

堆是一种优先队列,堆有两个特性: 结构性:用数组表示的完全二叉树; 有序性:任一结点的关键字是其子树所有结点的最值。如果是最大值,则成为最大堆;如果是最小值,称为最小堆。 基于第一个特性,可以用一个一维数组去存这个堆,起始下标为1。 对于堆的操作,下面只给出最大堆的插入和删除的操作。 插入元素 如图所示: 其主要思想是: 先将元素放入数组的最后一个位置 将这个元素进行向上调整 代码如下...

destiny_balabala的博客 238

堆排序以及其插入删除

接下来看一下堆排序的完整代码。接下来的才是完整堆排序的思想堆排序:每⼀趟将堆顶元素加⼊有序⼦序列(与待排序序列中的最后⼀个元素交换)并将待排序元素序列再次调整为⼤根堆(⼩元素不断“下坠”)第一步交换9 和87然后新的大根堆需要length-1以方便重新排堆(让87直接输出到数组末尾同时重新拍大根堆不算87)调整如下再一次首元素和末尾元素然后再一次调整剩下的元素的大根堆同时新大根堆的调整长度需要减1.再次断开一个元素,再次调整大根堆剩下操作如此往复即可n-1趟 处理之后:

m0_64845434的博客 1409

二叉堆 删除 插入 调整 堆排序

以最大堆为例 #include #define MAX 10000 using namespace std; typedef struct Heap Heap; struct Heap{ int size; int data[MAX]; }; //堆调整 void adjust_heap(Heap *heap, int size, int i){ int parent, child;

Unyielding will 429

Java排序(七):堆排序

堆排序的实现思想 讲堆排序前先了解一下什么是二叉堆: 二叉堆的定义         二叉堆是完全二叉树或者是近似完全二叉树。         二叉堆满足二个特性: 父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。   &nbsp...

LrvingTc的博客 228

二叉堆与堆排序

这篇博文对二叉堆有了很好的解读与阐述,在此根据自己的理解整理如下。二叉堆的定义   二叉堆,本质上是一棵完全二叉树。    二叉堆满足两个特性: 父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 每个结点的左子树和右子树都是一个二叉堆(都是大顶堆或小顶堆)。    当父结点的键值总是大于或等于任何一个子结点的键值时,堆为大顶堆(最大堆);当父结点的键值总是小于或等于任何一个子结点的键

u011836061的专栏 5140

堆排序/插入/删除 整理

#include #include #include #include using namespace std; void swap(int* v1, int* v2) { int data = *v1; *v1 = *v2; *v2 = data; } //堆调整 void adjust_heap(int* arr, int cur_index, int len) {

冰焰· 856

【数据结构•堆】堆排序(理论基础)

堆的定义• 堆是一个完全二叉树–所有叶子在同一层或者两个连续层–最后一层的结点占据尽量左的位置• 堆性质–为空, 或者最小元素在根上–两棵子树也是堆存储方式• 最小堆的元素保存在heap[1..hs]内– 根在heap[1]–K的左儿子是2k, K的右儿子是2k+1,–K的父亲是[k/2]删除最小值元素• 三步法– 直接删除根– 用最后一个元素代替根上元素– 向下调整• 首先选取当前结点p的较小儿子,如果比p大, 调整停止;

cgj0128_1的博客 466

二叉树-堆

堆在逻辑结构上是完全二叉树,在物理结构上(存储结构)是数组。堆又分为大堆和小堆。堆只规定父子结点间的大小关系,而不关注兄弟结点的大小关系。因此,堆不一定是有序的。大堆:任何父结点大于等于子结点。小堆:任何父结点小于等于子结点。堆的核心应用有:堆排序,topk问题,优先级队列。

m0_74067712的博客 214
上一篇: 平衡二叉树(AVL树)的插入、删除
下一篇: 哈夫曼树的创建
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值