排序算法之堆排序(附源码)

2023-05-16

1、将顺序存储的数据看成是一颗完全二叉树
2、对于大顶堆,确保每棵子树的根节点都是整个子树中的最大值;这就保证了根节点是所有数据中的最大值,但不保证所有数据有序。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/*
*************** achieve heap sorting*********************
*/
#include<iostream>
//#include<ctime>
//#include<algorithm>
using namespace std;

//调整子树为大顶堆结构
void heapAdjust(int data[], int start, int end)
{
	/*************方式一********************
	//int max = start;
	//int tmp = data[max];
	while (2 * start <= end)
	{
		int max = start;
		int left = 2 * start;
		int right = left + 1;
		
		if (data[max] < data[left] && left <= end)
		{
			max = left;
		}
		if (data[max] < data[right] && right <= end)
		{
			max = right;
		}
		if (max != start)
		{
			swap(data[start], data[max]);
			start = max;
		}
		else
		{
			break;
		}
	}*/


	/***********方式二*************/
	int tmp = data[start];
	for (size_t i = start*2; i <= end; i*=2)
	{
		//找出最大子节点
		if (i < end && data[i]<data[i+1])
		{
			++i;
		}
		if (tmp>=data[i])
		{
			break;
		}

		//令父节点等于最大子节点
		data[start] = data[i];
		start = i;//改变父节点序号
	}
	data[start] = tmp;
	
}

void heapSort(int data[], int start, int end)//变量 end 能表示长度
{
	//构造大顶堆
	for (size_t i = end/2; i > 0; i--)
	{
		heapAdjust(data, i, end);
	}

	//交换末尾元素与根节点元素(最大值),并对根节点进行调整,使其变成大顶堆
	for (size_t i = end; i > 1; i--)
	{
		swap(data[1], data[i]);
		heapAdjust(data, 1, i-1);
	}
}
int main()
{
	//测试用例一
	int b[9] = { -1,49,38,65,97,76,13,27,49 };
	for (size_t i = 1; i < 9; i++)
	{
		cout << b[i] << " ";
	}
	cout << endl;

	heapSort(b, 1, 8);

	for (size_t i = 1; i < 9; i++)
	{
		cout << b[i] << " ";
	}
	cout << endl;

	//测试用例二
	int a[11] = {-1, 7,3,2,6,9,1,2,0,6,4 };
	for (size_t i = 1; i < 11; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	heapSort(a, 1, 10);

	for (size_t i = 1; i < 11; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
	return 0;
}

STL中优先队列的应用

//堆实现优先队列

//Algo2-10.cpp STL中优先队列的应用   
#include<iostream>
#include<queue>
#include<vector>

using namespace std;

struct PosType
{
	int row;
	int col;
	
};


bool operator<(const PosType a, const PosType b)
{
	return a.row < b.row; //降序排列
}
bool operator>(const PosType a, const PosType b)
{
	return a.row > b.row; //升序排列
}/**/
class cmp
{
public:
	bool operator()(const PosType a, const PosType b)const
	{
		return a.row > b.row;
		//return a.row<b.row;//按PosType的row域降序排序
	}
};

void test1()
{
	PosType p[] = { {3, 4}, {5, 6}, {4, 1} }, q;
	//	priority_queue<PosType, vector<PosType>, cmp> pri_queue;
	priority_queue<PosType, deque<PosType>, cmp> pri_queue;//容器为双端队列

	for (int i = 0; i < 3; i++)
		pri_queue.push(p[i]);
	cout << "优先队列元素数=" << pri_queue.size() << endl;
	while (!pri_queue.empty())
	{
		q = pri_queue.top();
		cout << '(' << q.row << ", " << q.col << ") ";
		pri_queue.pop();
	}
	cout << endl;
	//return 0;
}

void test2()
{
	PosType p[] = { {3, 4}, {5, 6}, {4, 1} }, q;
	priority_queue<PosType, vector<PosType>, greater<PosType>> pri_queue; //升序
	for (int i = 0; i < 3; i++)
		pri_queue.push(p[i]);
	cout << "优先队列元素数=" << pri_queue.size() << endl;
	while (!pri_queue.empty())
	{
		q = pri_queue.top();
		cout << '(' << q.row << ", " << q.col << ") ";
		pri_queue.pop();
	}
	cout << endl;
}
  
void test3()
{
	int p[] = { 3,5,4 },q;
	//priority_queue<int, vector<int>, greater<int>> pri_queue; //升序
	priority_queue<int, vector<int>, less<int>> pri_queue; //降序
	for (int i = 0; i < 3; i++)
		pri_queue.push(p[i]);
	cout << "优先队列元素数=" << pri_queue.size() << endl;
	while (!pri_queue.empty())
	{
		q = pri_queue.top();
		cout << q<<" ";
		pri_queue.pop();
	}
	cout << endl;
}

int main()
{
	test1();
	test2();
	test3();
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法之堆排序(附源码) 的相关文章

  • 【千律】C++基础:TXT文件的创建、写入和读取

    include lt fstream gt include lt iostream gt using namespace std int main 初始化 ifstream iread txt 初始化输入流 ofstream write t
  • Matlab计算福利彩票的中奖概率

    Quez1 计算福彩双色球一等奖的中奖概率 福彩双色球的玩法如下 从编号1 33的红球里任选6个 另外在编号1 16的蓝球里再任选1个 如果选择的红球和蓝球和当期的开奖结果完全一致 顺序可不同 则中一等奖 Analysis 这是一个组合问题
  • 【千律】OpenCV基础:基于梯度的模板匹配

    环境 xff1a Python3 8 和 OpenCV 内容 xff1a 基于梯度的模板匹配 主要关注边缘信息 xff0c 能够较好的识别不同颜色的目标 实现步骤 xff1a 1 给定原图像I和模板T 2 指定差异度 xff08 相似度 x
  • golang使用SM2(SM2withSM3)签名、验签数据

    golang使用SM2签名 验签数据 场景标准密钥签名算法 Start依赖公钥转base64私钥转hex私钥生成公钥生成密钥对Hex私钥转私钥对象base64公钥转公钥对象签名验签 测试 场景 对接招行支付 标准 密钥 私钥 xff1a H
  • 树莓派与pixhawk串口通信

    一 Pixhawk部分 1 读取数据测试 步骤 xff1a 在Firmware src modules中添加一个新的文件夹 xff0c 命名为rw uart在rw uart文件夹中创建CMakeLists txt文件 xff0c 并输入以下
  • 关于pixhawk波特率修改的两种方法

    一 QGC地面站修改 将pixhawk与地面站相连接进入参数设置界面 xff0c 搜索SYS COMPANION参数设置需要的波特率保存设置 二 终端 xff08 Terminal xff09 修改 打开终端 xff0c 进入源码所在Fir
  • gazebo仿真环境搭建

    主要内容 xff1a 安装gazebo配置gazebo运行gazebomavros控制飞机 1安装gazebo 如果已经安装MAVROS可以直接在终端上输入gazebo查看是否已经拥有gazebo xff0c 因为MAVROS中含有gaze
  • Intel Realsense D435i标定详细步骤

    主要介绍Inter D435i深度相机的IMU 相机和IMU与相机外参数标定的过程 其中 IMU使用的是realsense官方文档的教程 相机和外参数使用的是Kalibr的标定方法 本文所介绍过程的所有代码和生成文件资源放在Kalibr工具
  • 在Ubuntu、NVIDIA_TX2下查看CPU/GPU/内存使用率

    一 Ubuntu 1 cpu 内存 1 使用top命令 top 2 更直观的工具htop sudo apt get install htop htop 2 gpu 用nivida smi命令 xff0c nvidia smi 这个命令只能显
  • 基于RT-Thread OS的 迷你时钟项目

    基于RT Thread OS的 迷你时钟项目 近期在自学RT Thread OS 这是一个国内团队开发的实时物联网操作系统 xff0c 具有组件完整丰富 高度可伸缩 简易开发等优点 RTOS官网 参考学习文档 作品演示 基于RT Threa
  • C++_namespace命名空间

    catalog 内嵌enum class namespace命名冲突多个同名namespace的原理开头 变量 函数前命名空间前 规范写法作用域Base定义顺序 内嵌 c 43 43 17后 支持 namespace A B C 写法 en
  • c++_exception异常,try和catch,noexcept,throw

    catalog noexcept 函数base自定义异常类noexcept 和 throw noexcept 函数 bool f 61 noexcept func 判断 func 函数 是否有标记noexcept base throw 是
  • SQL4种匹配规则

    SQL提供了四种匹配模式 xff1a 1 表示任意0个或多个 字符 如下语句 xff1a Select FROM user Where name LIKE 39 三 39 将会把name为 张三 xff0c 三脚猫 xff0c 唐三藏 等等
  • SDN的HUB实验

    SDN的hub实验 首先需要搭建ryu控制器环境和mininet环境 使用winscp将hub的py代码上传到服务器啊贝云 使用命令搭建拓扑环境 mn topo 61 single xff0c 3 controller 61 remote
  • CSDN上代码块背景颜色的设置

    CSDN上代码块背景颜色的设置 今天发博客的时候发现代码块背景的颜色是白色的 xff0c 我想要改成黑色的 xff0c 于是就研究了一下怎么修改代码块背景的颜色 xff0c 修改代码块的背景颜色只要4步 1 点击个人头像打开管理博客 2 在
  • 模拟电路和数字电路PCB设计的区别

    本文就旁路电容 电源 地线设计 电压误差和由PCB布线引起的电磁干扰 EMI 等几个方面 xff0c 讨论模拟和数字布线的基本相似之处及差别 工程领域中的数字设计人员和数字电路板设计专家在不断增加 xff0c 这反映了行业的发展趋势 尽管对
  • k8s部署资源服务的注意事项

    前言 为了k8s的资源服务能够高效 稳定 健康的运转 xff0c 需要对其进行相应的设置 资源类别 声明每个Pod的resource 在使用k8s集群时 xff0c 经常会遇到 xff1a 在一个节点上调度了太多的Pod xff0c 导致节
  • OCR中有见解的评论

    一 关于人脑与计算机识别的区别 电脑识别最主要是依赖简单的线性分类问题 把20 20个像素直接展成400维向量 xff0c 分类之 虽然现在的算法越来越常见地引入了非线性 xff0c 但是这种非线性的复杂度还是远没法和人脑相比 人脑则是多层
  • 梯度响应图——针对无纹理目标的检测

    题目 xff1a Gradient response maps for real time detection of textureless objects amp emsp xff1b gt amp ensp xff1b gt amp n

随机推荐

  • 深度学习技术在语义分割中的应用综述

    论文题目 xff1a A Review on Deep Learning Techniques Applied to Semantic Segmentation 博客园上的翻译 知乎上的提取 CSDN上的总结1 CSDN上的总结2
  • A Survey on Optical Character Recognition System 光学字符识别系统综述

    论文题目 xff1a 2017 A Survey on Optical Character Recognition System 摘要 光学字符识别 xff08 OCR xff09 是近年来研究的热点 它被定义为将文档图像数字化为其组成字符
  • 数据结构算法与解析(STL版含源码)

    文章目录 第1章 线性表1 1 顺序存储结构1 1 1 顺序表1 1 2 vector线性表 STL的顺序存储结构 1 2 链式存储结构1 2 1 单链表1 2 2 双向循环链表1 2 3 list线性表 STL的链式存储结构 1 3 静态
  • C++后台开发面试题集绵

    文章目录 一 C 43 43 语言1 引用和指针的区别 xff1f 3 C 43 43 中指针参数传递与引用参数传递 xff1f 4 形参与实参的区别 xff1f 5 static的用法和作用 xff1f 6 静态变量什么时候初始化 xff
  • 计算机网络

    文章目录 第一章 概述小结局域网 广域网 Internet网络通信 xff08 OSI模型 xff09 xff1a 计算机网络的性能指标 xff1a 第二章 物理层小结物理层的基本概念数据通信的基础知识基带与带通 xff1a 常用编码 xf
  • mysql使用和优化

    取当天0点0分 xff0c 下一天0点0分 UNIX TIMESTAMP获取时间戳 timestamp获取时间 select UNIX TIMESTAMP date sysdate timestamp adddate date sysdat
  • 数据库系统

    文章目录 第1章 概论第2章 基本知识与关系模型1 数据库 数据库管理系统 数据库系统什么是数据库什么是数据库系统什么是数据库管理系统DBMS小结 2 数据库系统的结构抽象与演变数据库系统的标准结构3 数据模型4 数据库系统的演变与发展5
  • 操作系统(学习笔记)

    文章目录 1 什么是操作系统2 操作系统的启动3 操作系统的接口4 系统调用的实现5 操作系统的历史6 我们的任务8 CPU管理9 多进程图像1 读写PCB xff0c OS中最重要的结构 xff0c 贯穿始终 2 要操作寄存器完成切换 x
  • 2020华为软挑总结

    文章目录 一 热身赛编程闯关 xff1a 评价标准 xff1a 问题分析 二 初赛问题描述评价标准 xff1a 问题分析思路一 xff1a 思路二 xff1a 思路三 xff1a 针对思路三的提速 xff1a 最终结果 xff1a 三 co
  • Linux命令总结之目录命令

    文章目录 Linux 目录命令1 96 ls 96 命令2 96 cd 96 命令3 96 pwd 96 命令4 96 mkdir 96 命令5 96 rm 96 命令6 96 mv 96 命令7 96 cp 96 命令8 96 cat 9
  • Markdown 公式指导手册

    Markdown 公式指导手册
  • Linux学习

    文章目录 一 基础入门二 Linux 命令总结一 Linux 目录命令 https blog csdn net weixin 42715287 article details 105825021 二 Linux 文件管理命令 https e
  • Linux命令总结之文件管理命令

    文章目录 二 Linux 文件管理命令1 96 which 96 命令到底什么是命令 xff1f 2 96 whereis 96 命令3 96 locate 96 命令4 96 find 96 命令5 96 xargs 96 命令 二 Li
  • Linux命令总结之文本编辑命令

    文章目录 Linux 文本编辑命令1 96 wc 96 命令2 96 grep 96 命令3 96 正则表达式 96 命令4 96 cut 96 命令5 96 paste 96 命令6 96 tr 96 命令7 96 sort 96 命令8
  • Linux命令总结之Linux 磁盘管理命令

    文章目录 Linux 磁盘管理命令1 96 df 96 命令2 96 du 96 命令3 96 time 96 命令 Linux 磁盘管理命令 1 df命令 linux 中 df 命令的功能是用来检查 linux 服务器的文件系统的磁盘空间
  • linux基础操作之一

    文章目录 1 基本概念及操作常用快捷键 xff1a 2 用户及文件权限管理1 Linux 用户管理1 查看用户 xff1a 2 创建账户 xff1a 3 用户组4 删除用户和用户组5 鲲鹏服务器安装 96 perf 96 6 阿里云服务器安
  • 重庆思庄Linux技术分享-linux中VDO的使用

    VDO xff08 Virtual Data Optimize虚拟数据优化 xff09 通过压缩或删除存储设备上的数据来优化存储空间 VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部 这些块设备也可以是加密设备 存储层 xff0
  • 排序算法之快排

    1 快排 快速排序算法的关键在于先在数组中选一个数字 xff0c 接下来把数组中的数字分成两部分 span class token comment achieve quick sorting span span class token ma
  • 排序算法之归并排序

    充分利用了把大问题转化成一个个小的子问题的思想 xff08 由迭代或递归来实现 xff09 span class token comment achieve merge sorting span span class token macro
  • 排序算法之堆排序(附源码)

    1 将顺序存储的数据看成是一颗完全二叉树 2 对于大顶堆 xff0c 确保每棵子树的根节点都是整个子树中的最大值 xff1b 这就保证了根节点是所有数据中的最大值 xff0c 但不保证所有数据有序 span class token comm