C++之堆排

news/2025/2/6 13:56:31/

 

堆排的原理和结构:

堆排序是一种常见的排序算法,基于堆这种数据结构实现。堆是一种特殊的树形数据结构,它满足以下两个条件:
堆是一棵完全二叉树。
堆的任意节点的值,都必须大于等于(或小于等于)左右子节点的值。
根据这些定义,我们可以将堆分为两种类型:最大堆和最小堆。
最大堆:根节点的值最大,任意节点的值都大于等于其左右子节点的值。
最小堆:根节点的值最小,任意节点的值都小于等于其左右子节点的值。
堆排序分为两个步骤:建堆和排序。
建堆:将待排序元素序列构建为一个堆。具体操作是从后往前遍历所有非叶子节点,逐个调整节点的值,使得它成为一个符合堆的定义的结构。建堆操作时间复杂度为O(n)。
排序:将堆中的元素依次取出,形成有序序列。具体的操作是,将堆顶元素(最大值或最小值)与堆底元素交换,然后将剩余元素重新构建堆。排序操作时间复杂度为O(n*log n)。
因此,堆排序的时间复杂度为O(n*log n),是一种不稳定的排序算法。

data++是什么意思(data)是一个数组?

data++是C语言中的一个表达式,它会将指针data指向的地址向后移动一个存储单位的距离,这里一个存储单位指的是数组的元素大小。如果data是一个数组名,则它代表数组的首元素的地址。

例如,如果data是一个int类型的数组,其大小为 4 字节,那么 data++ 表示将指针data向右移动 4 字节,指向数组中下一个元素的地址。

需要注意的是,由于data是一个指向数组的指针,当使用data++表达式时,会改变指针指向的位置,因此建议在代码中使用时要小心。

当传入一个数组时,这个数组的指针指向哪里?

在C语言中,当使用一个数组名作为实参传递给函数时,实际传递的是数组的第一个元素的地址,即数组名会被转换为一个指向其第一个元素的指针.

void headvisit(int data[],int n)
{
    int i , j , t;
    while(n>1)  //共有n个元素,每一个都要与父节点的值相比较 
    {
        for(i=n/2;i>=1;i--)// n/2是找到最后一个叶子的父节点在树中的位置,当i=1时,就说明此时在根节点处,在树中根节点是从1开始的 并不是0 
        {
            
            if(data[i-1]>data[2*i-1]) //根据树的基本结构 此处是与左孩子比较 
            {
                t = data[2*i-1];
                data[2*i-1] = data[i-1];
                data[i-1] = t;
            }
            
            //先判断右孩子是否存在 右孩子的度一定是小于等于总节点数的(n) 
            if( 2*i+1 <= n && data[i-1] > data[2*i-1+1])
            {
                t = data[2*i-1+1];
                data[2*i-1+1] = data[i-1];
                data[i-1] = t;
            }
        }
        data++; 
        n--;
    }
}

void outs(int data[],int n)
{
    for(int i = 0 ; i < n ; i++)
    {
        printf("%10d",data[i]);
    }
}
int main()
{
    int data[5] = {9,25,444,17536,9456};
    headvisit(data,5);
    outs(data,5);
    return 0;
}


http://www.ppmy.cn/news/89375.html

相关文章

Java版本工程项目管理系统源码,助力工程企业实现数字化管理

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

Revit中窗族的立面出图设置和构件显隐

​  一、窗族的立面出图设置 Revit中&#xff0c;除了平面的出图设置以外还有立面的出图设置。 例如&#xff1a;如何在立面中&#xff0c;使窗户在精细详细程度显示的是窗的全部主体结构而在粗略/中等详细程度下是显示这样的样式呢? 在窗族样板中&#xff0c;打开立面&…

78.建立一个Web应用程序的布局第二部分

上节课中&#xff0c;我们实现的页面如下图所示&#xff1a; 而最终的页面如下图所示&#xff1a; ● 首先我们 先添加menu的按钮 <menu><button>New</button><button>Reply</button><button>Forward</button><button>Mar…

buildroot简介

网址 官网&#xff1a;https://buildroot.org/ 下载地址&#xff1a;https://buildroot.org/download.html 使用 解压后&#xff0c;执行make menuconfig Target options &#xff08;目标板配置&#xff09; Target Architecture&#xff1a; 目标架构&#…

深度学习之神经网络是如何自行学习的?

大家好&#xff0c;我是带我去滑雪&#xff01; 深度学习算法是一种神经网络&#xff0c;而神经网络就是数据结构的图形结构&#xff0c;函数集的运算是向量和矩阵运算&#xff0c;调整函数集的参数需要使用微分和偏微分来找出最优解。深度学习可以通过几何学来进行解释&#x…

分布式项目 11 在项目中使用jsonp发送请求并且处理

在项目中使用jsonp技术 01.相关子系统的搭建 第一步&#xff1a;创建一个新的子系统&#xff0c;叫做jt-sso 选中jt父级项目&#xff0c;然后鼠标右键进行new&#xff0c;然后选中maven Model&#xff0c;进行项目的创建&#xff0c;具体操 作如下图所示&#xff1a; 第二步…

平板用什么远程操控电脑

现在的第三方专业远程软件大部分支持跨平台连接&#xff0c;要使用平板电脑远程控制电脑&#xff0c;还是很简单的。一般来说按照以下步骤操作即可。 确保两台设备都连接到互联网 确保您要控制的电脑和平板电脑都通过 Wi-Fi 或移动数据连接到互联网。 安装远程控制应用程序 …

手持式网络性能测试仪应用于哪些领域及可以完成什么工作?

首先明辰智航国产网络一点通有千兆和万兆以手持式网络性能测试仪&#xff0c;两款仪器可以应用于以下领域&#xff1a; 电信运营商&#xff1a;用于测试网络质量、信号强度、带宽、时延、丢包率等参数&#xff0c;以便优化网络性能和提高用户满意度。 企业网络管理&#xff1a…