首页 > 编程语言 >【调整堆】(C++ 代码实现 & 注释详解)

【调整堆】(C++ 代码实现 & 注释详解)

时间:2024-06-09 12:04:07浏览次数:15  
标签:int C++ 注释 length 详解 HeapAdjust SqList rc 移动

 自定义结构体:

#define sz 105
typedef struct node{
	int length;
	int l[sz];
}SqList;

 调整堆的函数:

HeapAdjust函数思路说明:

//目标:将以s为根的子树调整为大根堆

//具体操作:将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就“放下”s

void HeapAdjust(SqList &L, int s, int m)//将以s为根的子树调整为大根堆<=>将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就放下s
{
	int rc = L.l[s];
	for(int j = 2*s; j <= m; j *= 2)//j指向s的左子树
	{
		if(j<m && L.l[j] < L.l[j+1] ) j+=1;//j指向s的子树中较大的那个
		if(rc >= L.l[j]) break;//此时接着执行L.l[s] = rc; 便可实现上述目标
		L.l[s] = L.l[j]; s = j;//将路径上比s大的都往上移动,s往下移动
	}
	L.l[s] = rc;
}

void CreateHeap(SqList &L)
{
	int n = L.length;
	for(int i=n/2; i>0; i--)//从n/2向下取整得到的整数所对应的结果开始,依次进行调整堆的操作
	{						//关于为什么从n/2开始: 因为在n/2后面的节点都是叶子结点,不需要调整
		HeapAdjust(L, i, n);
	}
}

 完整代码:

#include<bits/stdc++.h>
using namespace std;
#define sz 105
typedef struct node{
	int length;
	int l[sz];
}SqList;

void HeapAdjust(SqList &L, int s, int m)//将以s为根的子树调整为大根堆<=>将路径上比s大的都往上移动,s往下移动,直到遇到比s还小的,就放下s
{
	int rc = L.l[s];
	for(int j = 2*s; j <= m; j *= 2)//j指向s的左子树
	{
		if(j<m && L.l[j] < L.l[j+1] ) j+=1;//j指向s的子树中较大的那个
		if(rc >= L.l[j]) break;//此时接着执行L.l[s] = rc; 便可实现上述目标
		L.l[s] = L.l[j]; s = j;//将路径上比s大的都往上移动,s往下移动
	}
	L.l[s] = rc;
}

void CreateHeap(SqList &L)
{
	int n = L.length;
	for(int i=n/2; i>0; i--)//从n/2向下取整得到的整数所对应的结果开始,依次进行调整堆的操作
	{						//关于为什么从n/2开始: 因为在n/2后面的节点都是叶子结点,不需要调整
		HeapAdjust(L, i, n);
	}
}

int main()
{
	SqList L;
	L.length = 0;
	srand(time(NULL));//随机数种子
	for(int i=1; i<=100; i++)
	{
		int rand_int = rand()%100;//生成0 ~ 99的随机整数
		L.l[i] = rand_int;
		cout<<rand_int<<" "; 
		L.length++;
	}
	CreateHeap(L);
	cout<<"\n"<<"after Adjustment: "<<endl;
	for(int i=1; i<=L.length; i++ )
	{
		cout<<L.l[i]<<" ";
	}
	return 0;
}

运行结果示例:

~希望对你有帮助~

标签:int,C++,注释,length,详解,HeapAdjust,SqList,rc,移动
From: https://blog.csdn.net/H13420972436/article/details/139559934

相关文章

  • 跨语言系统中的功能通信:Rust、Java、Go和C++的最佳实践
    在现代软件开发中,使用多种编程语言构建复杂系统已成为一种常见的做法。每种编程语言都有其独特的优势和适用场景,这使得在同一个系统中使用多种语言变得合理且高效。然而,这也带来了一个重要的挑战:如何在这些不同语言之间实现高效、可靠的功能通信。本文将探讨Rust、Java、Go和C+......
  • 程序的基本结构、cout语句(c++语言)
    一、如何下载Dev C++    登录网站:ht.51goc.com二、安装DevC++一、启动DevC++   双击桌面的图标 二、新建一个程序三、复制一个程序    请你复制以下代码到“程序编辑区”    #include<bits/stdc++.h>usingn......
  • 【C++】初识C++
    【C++】初识C++文章概括关键字(C++98)命名空间命名空间的定义命名空间的特性输入与输出C++中的输入输出输入输出的命名空间缺省参数函数重载引用引用的概念引用的特性引用地使用场景引用做参数引用做返回值常引用常引用的俩个例子引用与指针的区别内联函数文章概括......
  • 【C++】类和对象(上)
    类和对象初步认识面向过程与对象类的引入类的定义类的封装类的访问限定符类的作用域类的实例化类的大小this指针this指针的特性初步认识面向过程与对象在之前初步学习C语言后,可以了解到C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题......
  • 避免内存泄漏:C++ 虚析构函数指南
    C++虚析构函数详解及示例在C++编程中,虚析构函数的使用至关重要,尤其在涉及多态时。以下将解释虚析构函数的作用、在基类中使用虚析构函数的必要性以及纯虚析构函数的定义。1.为什么需要虚析构函数?当基类的析构函数没有被声明为虚函数时,通过基类指针删除派生类对象会导致无......
  • C++ 抽象类与纯虚函数详解:理论与实战
    抽象基类为什么不能创建对象?抽象类是一种特殊的类,它被设计用来作为其他类的基类,不能实例化为对象。以下是关于抽象类和纯虚函数的详细解释:1.抽象类的定义:抽象类:带有纯虚函数的类称为抽象类。抽象类不能实例化对象,只能作为基类被继承。纯虚函数:一种没有实现的虚函数,其定义格......
  • 深入解析C++中自动生成默认构造函数的五种情况
    自动生成默认构造函数的情况以及相关解释在C++中,当一个类没有任何用户定义的构造函数时,编译器会自动为这个类生成一个默认构造函数。以下是具体情况的解释以及示例:1.带有默认构造函数的类成员对象如果一个类没有任何构造函数,但它含有一个成员对象,而该成员对象有默认构造......
  • 为什么C++友元函数必须在类内部声明?解析与案例
    友元函数是C++中独特的编程结构,允许一个非成员函数或者其他类访问另一个类的私有和保护数据成员。友元在很多情况下是非常有用的,比如操作符重载、类间紧密合作等。为什么需要在类内部声明友元函数?访问权限:友元函数需要访问类的私有和保护数据成员。为此,必须在类内部声明,以便......
  • 栈经典题目(C++)
    文章目录前言一、删除字符串中的所有相邻重复项1.题目解析2.算法原理3.代码编写二、基本计算器II1.题目解析2.算法原理3.代码编写三、字符串解码1.题目解析2.算法原理3.代码编写四、验证栈序列1.题目解析2.算法原理3.代码编写总结前言一、删除字符串中的所有......
  • 淘宝/天猫商品信息获取与搜索优化:详解API接口在商品详情获取与关键字搜索中的应用
    在数字化时代,电商平台的API接口成为了连接商家、开发者与消费者的重要桥梁。淘宝和天猫作为中国领先的电商平台,提供了丰富的API接口,使得商家和开发者能够更加便捷地获取商品信息和实现商品搜索功能。本文将详细介绍淘宝/天猫的商品详情API接口和按关键字搜索商品API接口,探讨如......