c++堆排序-建堆-插入-删除-排序

news2024/11/24 12:21:51

本文以大根堆为例,用数组实现,它的nums[0]是数组最大值。

时间复杂度分析:

建堆o(n)

插入删除o(logn)

堆排序O(nlogn)

首先上代码

#include<bits/stdc++.h>

using namespace std;
void down(vector<int>&nums, int idx, int n)
{
	//删除时和由数组创建堆时用到
	int leftidx = 2 * idx + 1;
	int rightidx = 2 * idx + 2;
	if (leftidx >= n && rightidx >= n)
		return;
	if (rightidx >= n && nums[idx] >= nums[leftidx])
		return;
	if (rightidx < n&&nums[idx] >= nums[leftidx] && nums[idx] >= nums[rightidx])
		return;
	if (rightidx >= n || nums[leftidx] >= nums[rightidx])
	{
		swap(nums[idx], nums[leftidx]);
		down(nums, leftidx, n);
	}
	else
	{
		swap(nums[idx], nums[rightidx]);
		down(nums, rightidx, n);
	}
}

void up(vector<int>&nums, int idx)
{
	//上滤操作由插入元素时用到,此处使用vector动态数组,不考虑静态数组插入元素过多导致过界拷贝扩容问题。
	int faridx = (idx - 1) / 2;
	if (idx == 0 || nums[idx] <= nums[faridx])
		return;
	swap(nums[idx], nums[faridx]);
	up(nums, faridx);
}

void heapfy(vector<int>&nums)
{
	int n = nums.size();
	for (int i = n - 1; i >= 0; --i)
	{
		if (2 * i + 1 <= n - 1)
			down(nums, i,n);
	}

}
	
void heapinsert(vector<int>&nums,int val)
{
	nums.emplace_back(val);
	int n = nums.size();
	up(nums, n - 1);
}

void heapdel(vector<int>&nums)
{
	int n = nums.size();
	nums[0] = nums[n - 1];
	nums.pop_back();
	--n;
	down(nums, 0, n - 1);
}
void heapsort(vector<int>&nums)
{
	int n = nums.size();
	while (n> 1)
	{
		swap(nums[0], nums[n - 1]);
		down(nums, 0, n-1);
		--n;
	}
}

int main()
{
	vector<int>nums = { 2,1,4,6,5,8,0,7};
	heapfy(nums);
	for (auto& num : nums)
		cout << num <<" ";
	cout << "建队完成"<<endl;
	heapinsert(nums, 9);
	for (auto& num : nums)
		cout << num << " ";
	cout << "插入完成"<<endl;
	heapdel(nums);
	for (auto& num : nums)
		cout << num << " ";
	cout << "删除完成"<<endl;
	heapsort(nums);
	for (auto& num : nums)
		cout << num << " ";
	cout << "排序完成,堆结构已破坏" << endl;
}

读者可以复制代码到编译器里运行一下试试,帮助理解

它的主要思路参考力扣官方讲解

LeetCode 力扣官方分享 | 最大堆的基本内容和堆排序 - 知乎 (zhihu.com)

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

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

相关文章

ThreeJS-3D教学四-光源

three模拟的真实3D环境&#xff0c;一个非常炫酷的功能便是对光源的操控&#xff0c;之前教学一中已经简单的描述了多种光源&#xff0c;这次咱们就详细的讲下一些最常见的光源&#xff1a; AmbientLight 该灯光在全局范围内平等地照亮场景中的所有对象。 该灯光不能用于投射阴…

【CAN信号解析】使用python-can/cantools解析CAN数据

文章目录 1. 如何解析CAN消息1.1 简介1.2 python-can库使用2. python-can库介绍2.1 完整解析流程2.2 简单示例3. 总结与坑4. 代码示例1. 解析一个DBC2. 生成一个DBC3. 解析.asc数据 保存为.csv格式1. 如何解析CAN消息 关于CAN的基础知识,可阅读如下链接: CAN协议详解CAN消息…

作为SiteGPT替代品,HelpLook的优势是什么?

在当今快节奏的数字化世界中&#xff0c;企业不断寻求创新方式来简化运营并增强客户体验。由于聊天机器人能够自动化任务、提供快速响应并提供个性化互动&#xff0c;它们在业务运营中的使用变得非常重要。因此&#xff0c;企业越来越意识到像SiteGPT和HelpLook这样高效的聊天机…

分享5个自动生成PPT的网站

1、Mindshow 之前公众号里分享过这款做PPT的AI工具&#xff0c;这次再拿出来分享一次。 没别的原因&#xff0c;确实好用。 而且也是目前能够和ChatGPT结合使用最好的PPT工具之一。 直接在ChatGPT生成PPT内容&#xff0c;转成Markdown格式复制进来一键排版&#xff0c;一份P…

MySQL ——多表连接查询

一、&#xff08;左、右和全&#xff09;连接概念 内连接&#xff1a; 假设A和B表进行连接&#xff0c;使用内连接的话&#xff0c;凡是A表和B表能够匹配上的记录查询出来。A和B两张表没有主付之分&#xff0c;两张表是平等的。 关键字&#xff1a;inner join on 语句&#xf…

更好用的的MybatisPlus:MybatisFlex(上)

更好用的的MybatisPlus&#xff1a;MybatisFlex&#xff08;上&#xff09; 前言 Mybatis 是我们常用的一个 ORM 框架&#xff0c;而 MybatisPlus &#xff08;以下简称 MP&#xff09; 则是对 Mybatis 进行了一层封装&#xff0c;便捷了我们的开发工作&#xff0c;但是由于其…

进程管理--进程调度基本概念

进程调度 进程调度的核心代码实现参考 kernel/sched/ 目录文件&#xff0c;主要包含以下几个部分&#xff1a; 调度算法&#xff1a;Linux 中实现了多种不同的进程调度算法&#xff0c;如 CFS&#xff08;Completely Fair Scheduler&#xff09;、O(1) 调度算法、实时调度算法…

RocketMQ Dashboard说解

RocketMQ Dashboard 是 RocketMQ 的管控利器&#xff0c;为用户提供客户端和应用程序的各种事件、性能的统计信息&#xff0c;支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 介绍​ 功能概览​ 面板功能运维修改nameserver 地址; 选用 VIPChannel驾驶舱查看 …

python编程:加速计算机,优化性能的关键一步——清理临时文件夹Temp

引言&#xff1a; 随着时间的推移&#xff0c;您可能会注意到计算机的性能开始变慢。这可能是由于许多因素导致的&#xff0c;其中一个常见的问题是临时文件的积累。临时文件是由操作系统和应用程序生成的临时性文件&#xff0c;它们在使用后往往被遗忘或忽视。在本篇博客中&am…

[移动通讯]【Carrier Aggregation-4】【LTE-6】

前言&#xff1a; 这里主要介绍一下CA 技术里面&#xff0c;物理层主要工作。 参考&#xff1a; 载波聚合&#xff08;CA&#xff09; 目录&#xff1a; 1&#xff1a; CA 总体分析流程 2&#xff1a; CA 物理层 一 CA 总体分析流程 二 CA物理层 2.1 载波聚合LOG分析的相关包…

基于微信小程序的英语互助小程序设计与实现(亮点:小组制打卡、模拟考试答题、错题本、学习论坛)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

如何看待中小企业实现数字化转型难的问题?_光点科技

随着科技的飞速发展和市场的竞争日益激烈&#xff0c;传统制造型企业不得不迎头赶上数字化时代的步伐&#xff0c;以保持竞争力并实现可持续增长。数字化转型已成为企业生存和成功的必经之路&#xff0c;但对于那些长期依赖传统方法的企业来说&#xff0c;这个过程可能会充满挑…

积加ERP与金蝶云星空对接集成日期范围报告查询打通销售出库新增

积加ERP与金蝶云星空对接集成日期范围报告查询打通销售出库新增 对接源平台:积加ERP 积加创始人及核心产品技术团队&#xff0c;深耕于跨境电商技术领域十余年&#xff0c;深刻领悟卖家在Amazon业务运营各环节的核心诉求&#xff0c;结合多年技术管理经验&#xff0c;全面考虑中…

18年互联网老兵:技术人如何快速成长?!

见字如面&#xff0c;我是军哥。 先问你几个问题。 你是不是每天996&#xff0c;但技术能力还是没有提高&#xff1f; 你是不是明明很努力却进步缓慢&#xff1f; 你是不是在同一家公司干了三年&#xff0c;感觉自己就有三年工作经验了&#xff1f; 你是不是明明知道想要什么&a…

【调度算法】进程调度算法、内存页面置换算法、LRU算法、LFU算法、磁盘调度算法等重点知识汇总

目录 进程调度算法 内存页面置换算法 LRU算法实现 LFU算法实现 磁盘调度算法 进程调度算法 当 CPU 空闲时&#xff0c;操作系统就选择内存中的某个「就绪状态」的进程&#xff0c;并给其分配 CPU。 什么时候会发生 CPU 调度呢&#xff1f;通常有以下情况&#xff1a; 当…

数字孪生燃气可视化系统的九问九答

关键词&#xff1a;数字孪生燃气、智慧燃气、数字孪生燃气系统、智慧燃气平台、智慧燃气场站 谈谈数字孪生燃气系统&#xff1f; 数字孪生燃气是将数字孪生技术应用于燃气运营中&#xff0c;与燃气系统物理实体、数据中心、信息系统等相结合&#xff0c;从而完成辅助管网设计…

想要在手机上查看三维模型、正射影像、激光点云?快来试试这款app

「四维轻云」是一款轻量化的地理空间数据管理云平台&#xff0c;支持地理空间数据的在线管理、编辑及分享。平台有项目管理、场景搭建、发布分享、素材库等功能模块&#xff0c;支持多用户在线协作管理&#xff0c;实现了轻量化、便捷化的空间数据应用。 很多行业用户想要在手…

Observability:使用 OpenTelemetry 自动检测 Java 应用程序

作者&#xff1a;David Hope 在快节奏的软件开发领域&#xff0c;特别是在云原生领域&#xff0c;DevOps 和 SRE 团队日益成为应用程序稳定性和增长的重要合作伙伴。 DevOps 工程师不断优化软件交付&#xff0c;而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管理者。…

linux使用操作[2]

文章目录 版权声明网络传输ping命令wget命令curl命令端口linux端口端口命令和工具 进程管理查看进程关闭进程 主机状态top命令内容详解磁盘信息监控 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程序员或相…

视频转码软件 EditReady mac中文版介绍

EditReady for Mac是一款专业高效的视频转码器&#xff0c;拥有快速&#xff0c;强大的特点&#xff0c;可以调整视频大小&#xff0c;对视频进行旋转&#xff0c;重新定时等功能&#xff0c;对于需要的朋友&#xff0c;还可以查看和编辑元数据&#xff0c;EditReady Mac中文版…