堆排序,建初始堆以及优先队列(priority_queue)

news2024/11/25 0:34:00

1.堆:

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<=K2i+2 ,则称为小堆(或大堆)。

将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
 

性质:

1. 堆中某个节点的值总是不大于或不小于其父节点的值;
2. 堆总是一棵完全二叉树。

 

2.堆排序和创建初始堆

#include<iostream>

using namespace std;


void HeapAdjust(int r[], int s, int t) {
	//先将现在要调整的根节点的数据和下标记录下来
	int temp = r[s];
	int i = s;

	
	for (int j = 2 * i; j <= t; j = 2 * j) {
		//2*i和2*i+1是下标为i的结点的孩子结点的下标,找出其中最大的
		if (j < t && r[j] < r[j + 1]) {
			j = j + 1;
		}
		//如果孩子结点中最大的值都没有根节点的值大,那么就不用交换了
		//注意这里一直用的是temp,temp的值在for循环中不会改变
		if (temp > r[j]) {
			break;
		}

		r[i] = r[j];//交换
		i = j;
	}
	r[i] = temp;
}

void HeapSort(int r[], int n) {
	//创建初始堆,从n/2开始是因为第n/2个结点才开始拥有孩子结点
	for (int i = n / 2; i > 0; i--) {
		HeapAdjust(r, i, n);
	}

	for (int i = n; i > 1; i--) {
		r[0] = r[1];
		r[1] = r[i];
		r[i] = r[0];
		HeapAdjust(r, 1, i - 1);
	}
}

int main()
{
	//对1--n范围的数据进行排序,s[0]是作为进行交换数据的位置
	int s[20] = { 0,2,5,4,1,9,6,7,10,15 };

	HeapSort(s, 9);

	for (int i = 1; i <= 9; i++) {
		cout << s[i] << " ";
	}
	return 0;
}

 

这是我自己改的HeapAdjust函数:

void HeapAdjust(int r[], int s, int t) {
	//先将现在要调整的根节点的数据和下标记录下来
	int temp = r[s];
	int i = s;

	
	for (int j = 2 * i; j <= t; j = 2 * j) {
		//2*i和2*i+1是下标为i的结点的孩子结点的下标,找出其中最大的
		if (j < t && r[j] < r[j + 1]) {
			j = j + 1;
		}
		//如果孩子结点中最大的值都没有根节点的值大,那么就不用交换了
		if (temp > r[j]) {
			break;
		}

		//交换
		r[i] = r[j];
		r[j] = temp;
		temp = r[i];
		i = j;
	}
}

3.优先队列(priority_queue)

优先队列(priority_queue)的原理及用法

一、优先队列的原理及使用
std::priority_queue:在优先队列中,优先级高的元素先出队列,并非按照先进先出的要求,类似一个堆(heap)。其模板声明带有三个参数,priority_queue<Type, Container, Functional>, 其中Type为数据类型,Container为保存数据的容器,Functional为元素比较方式。Container必须是用数组实现的容器,比如 vector, deque. STL里面默认用的是vector. 比较方式默认用operator< , 所以如果把后面两个参数缺省的话,优先队列就是大顶堆,队头元素最大。

priority_queue(),默认按照从小到大排列。所以top()返回的是最大值而不是最小值!

使用greater<>后,数据从大到小排列,top()返回的就是最小值而不是最大值!

如果使用了第三个参数,那第二个参数不能省,用作保存数据的容器!!!!

priority_queue<int, greater<>> pq;//这是错误的

priority_queue<int,vector<int> , greater<>> pq;//这是对的


这里再提一嘴,greater<int>与greater<int>() 的区别,这要根据函数原型要求参数是函数对象类型还是要求参数是结构类型。greater<int> 对应于结构的类型,greater< int>()对应于没有参数且返回类型更大的函数的类型。比如multimap中使用不带括号的,sort使用带括号的。

二、基本操作
优先队列在头文件#include <queue>中;

其声明格式为:priority_queue <int> ans;//声明一个名为ans的整形的优先队列

基本操作有:

empty( )  //判断一个队列是否为空

pop( )  //删除队顶元素

push( )  //加入一个元素

size( )  //返回优先队列中拥有的元素个数

top( )  //返回优先队列的队顶元素

优先队列的时间复杂度为O(logn),n为队列中元素的个数,其存取都需要时间。
三、使用方法

#include<iostream>
#include<queue>
using namespace std;

int main()
{
	vector<int> aa = { 1,2,4,3,8,6,1,4 };
	priority_queue<int, vector<int>,greater<>> pq;
	for (int i = 0; i < aa.size(); i++) {
		pq.push(aa[i]);
	}
	sort(aa.begin(), aa.end());
	for (int i = 0; i < aa.size(); i++)
		cout << aa[i];
	cout << endl;
	for (int i = 0; i < aa.size(); i++) {
		cout << pq.top();
		pq.pop();
	}
	//cout << pq << endl;
	system("pause");
	return 0;
}

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

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

相关文章

Docker部署jenkins配置公私钥拉取代码

容器内配置公私钥 先进入部署Jenkinns中的容器&#xff0c;在docker容器内生成公私钥 ssh-keygen -t rsajenkins 配置私钥信息 在Dashbord->凭据->系统->全局凭据中新增一个凭据 将公钥配置在gitlab 正常这么配制就可以了&#xff0c;但是在jenkins上发现使用ssh…

如何快速掌握代币经济学

如何研究加密世界里的Token? 先看一组数据&#xff1a;截至2022年&#xff0c;市面上大约有6000种加密货币(或者更多&#xff09;。这对投资者来说当然是一个很大的机会。然而&#xff0c;在2021年&#xff0c;投资者在Crypto项目遇到欺诈&#xff0c;损失的金额120亿美元。因…

2022年河北沃克金属制品有限公司助力河北石家庄电子商务资源对接暨电商直播选品大会圆满落幕!

会议主题&#xff1a;聚合电商直播优势资源 赋能产业发展消费增长 主题活动&#xff1a;2022河北•石家庄电子商务资源对接暨电商直播选品大会 承办日期&#xff1a;2022年12月26日至2022年12月27日 主办单位&#xff1a;石家庄市商务局 指导单位&#xff1a;河北省商务厅 …

基于K8s的DevOps平台实践(一)

文章目录前言1. DevOps介绍&#x1f351; 瀑布式流程&#x1f351; 敏捷开发&#x1f351; DevOps2. Jenkins初体验&#x1f351; K8s环境中部署jenkins&#x1f351; 安装汉化插件3. Jenkins基本使用演示&#x1f351; 演示目标&#x1f351; 演示准备&#x1f351; 演示过程4…

04贪心算法

文章目录背包问题活动安排问题最优装载问题删数问题最优服务次序贪心算法 在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的是在某种意义上的局部最优解。 过程&#xff1a; 建立数学模型来描述问…

奖励视频 — Verasity 的最新专利意味着什么?

目录 Verasity 的最新专利涵盖哪些内容&#xff1f; 美国专利审批流程——拒绝和批准 主张我们的专利并寻求许可费 这对 Verasity 意味着什么&#xff1f; 近日&#xff0c;我们宣布Verasity 已在全球最大的广告和媒体市场美国获得奖励视频专利。 该专利及其全部内容可在此…

Vue--》超详细教程——vite脚手架的搭建与使用

目录 vite 创建 vite 项目 目录文件的构成 vite项目的运行流程 开发者工具安装 vite vue官方提供了两种快速创建工程化的SPA项目的方式&#xff0c;一种是基于 vue-cli 创建的SPA项目&#xff0c;另一种就是基于 vite 创建的SPA项目。两者的区别如下&#xff1a; 说明v…

如何在电脑录屏?win10录屏快捷键ctrl+alt+

日常使用的电脑有很多功能未被大家发现&#xff0c;比如可以录制屏幕视频&#xff1b;那如何在电脑录屏&#xff1f;win10电脑录屏有没有什么快捷键可以快速录制&#xff1f;下面就一起和小编来看看win10录屏快捷键是如何在电脑录屏的&#xff0c;有需要的朋友可以去试试看。 一…

观察者模式Observer

1.意图&#xff1a;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 2.结构 Subject&#xff08;目标&#xff09;知道它的观察者&#xff0c;可以有任意多个观察者观察同一个目标&#xff1…

Flutter GetX系列教程---GetxController

安装 将 GetX 添加到你的 pubspec.yaml 文件中 dependencies:get: ^4.6.5在需要用到的文件中导入&#xff0c;它将被使用。 import package:get/get.dart;GetxController介绍 在实际的项目开发过程中&#xff0c;我们不可能把UI代码、业务逻辑都放在一起处理&#xff0c;这…

Google 二次签名 导致 Facebook , Google 登录失败

前言&#xff1a; 最近接了几款游戏 里面携带了facebook 授权登录和google 授权问题 问题场景 在没有上线之前 我们运营和测试 验收都没有问题 但是把游戏包发到商店后再重商店下载出来就不能授权登录。 原因 因为App上传到Google Play后&#xff0c;Google Play 有个签名…

使用idea无法推送到gitee,显示head detached(游离分支)

在idea下将代码回退到某一历史版本&#xff0c;修改后push提醒detaced head&#xff0c;即处于游离状态&#xff0c;使用 git branch命令&#xff08;辅助git status查看提交状态&#xff09;查看&#xff1a; 解决方法 在git bash下***&#xff08;注意&#xff09;切换到项…

django使用一——规范化创建

背景 为便于后续维护&#xff0c;前期对django创建等操作做一些规范化要求 实操 1、【项目创建】先创建一个项目&#xff0c;其中SSS可以项目架构相关&#xff0c;XXX则是项目名称 常用命令&#xff1a; django startproject SSS_app_XXX如果提示报错django命令不存在&…

超全地牢场景unity3d模型素材网站整理

家人们&#xff0c;最近我找到了一个很好用的地牢场景unity3d模型免费素材网站 资源贼多&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;嘿嘿嘿&#xff01;&#xff01;&#xff01;感兴趣的可以进去看看 接下来就给大家介绍一下我珍藏已久的网站&#xff1a; …

string类的基本使用及模拟实现(深浅拷贝)

目录 浅拷贝与深拷贝 string的基本使用和模拟实现 浅拷贝与深拷贝 namespace lyl { class string { public: string(const char* str) :_str(new char[strlen(str)1]) { strcpy(_str, str); } ~string() …

TPM零知识学习九 —— TPM规范学习之TPM介绍

前边的系列文章主要从实际平台移植和TPM环境搭建的角度讲解了TPM&#xff0c;现在到了踏实下来学习理论知识的时候了。从本篇文章开始&#xff0c;开启TPM2.0规范学习之旅。参考书目为&#xff1a;《A Practical Guide to TPM 2.0 — Using the Trusted Plaform Module in the …

利器 | REST Assured 实践(二):断言实现

在上一篇文章中&#xff0c;我们初步探讨了 REST Assured 的应用实践&#xff0c;还有很多丰富的用法需要慢慢探索研究。而 REST Assured 提供的完整断言手段&#xff0c;是测试工程师最常用最重要的功能之一。断言该如何使用呢&#xff1f; 这里以 rest-assured 官方给的一个…

好用的元数据管理工具是什么样

元数据是数据的“说明书”&#xff0c;元数据管理工具是企业数据治理的重要抓手&#xff0c;它可以帮助企业解决数据查找难、理解难等问题&#xff0c;促进数据的集成和共享。一个趁手的元数据管理工具是什么样的呢&#xff1f; 01 系统架构 从应用角度看&#xff0c;元数据管…

基于颜色直方图优化的图像增强方法

最近改图像颜色迁移的论文&#xff0c;审稿人要求补充基于直方图优化的方法细节。趁此机会&#xff0c;我重新下载了相关文献&#xff0c;决定重新学习下该类方法&#xff0c;并把一些细节记录在本篇博客中&#xff0c;供交流学习。 目录 1. 前言 2. 背景知识 3. 颜色变换 4. 颜…

若依源码分析(二)-登录流程源码分析

若依源码分析&#xff08;二&#xff09;-登录流程源码分析 本章节主要分析若依源码登录流程&#xff0c;一步一步走断点查看进入首页的全流程登录信息 1. 前台发起登录请求 http://127.0.0.1/dev-api/auth/login //auth表明这个请求走的是服务名称为auth的服务2. 后台处理流…