堆排序,学习笔记

news2024/12/23 11:50:36

目录

一、概念

二、堆排序的基本思路

三、堆排序的基本步骤

1. 构建初始堆:

2. 排序过程

四、示例

五、应用场景

1. 优先级队列相关场景

2. TopK 值问题


一、概念

        堆排序是一种基于二叉堆数据结构的排序算法。二叉堆是一种完全二叉树,它分为两种类型:最大堆和最小堆。在最大堆中,每个节点的值都大于或等于它的子节点的值;在最小堆中,每个节点的值都小于或等于它的子节点的值。堆排序利用了堆的这种性质来实现排序

        例如,对于一个最大堆,根节点的值是整个堆中的最大值。当我们要进行排序时,我们可以利用这个性质,每次将堆顶元素(最大值)取出,然后重新调整堆,使得剩余元素仍然保持堆的性质,如此反复,直到堆为空,就可以得到一个有序的序列

二、堆排序的基本思路

        堆排序主要利用了堆的性质来实现排序。如果是要进行升序排序,就构建一个最大堆;如果是要进行降序排序,就构建一个最小堆。以升序排序为例,首先将待排序的数组构建成一个最大堆,此时堆顶元素(即数组的第一个元素)就是最大值。然后将堆顶元素与数组的最后一个元素交换位置,这样最大值就被放到了数组的最后。接着,对剩下的元素重新构建最大堆,再将堆顶元素与倒数第二个元素交换位置,如此反复,直到整个数组都有序

三、堆排序的基本步骤

1. 构建初始堆:

        假设我们有一个数组arr,要将其构建成一个最大堆。首先,我们从最后一个非叶子节点开始调整堆。对于一个长度为n的数组,最后一个非叶子节点的索引是parent(n/2 - 1),其中parent(i)表示节点i的父节点索引,计算公式为parent(i)=(i - 1)/2。

        对于每个非叶子节点,我们比较它和它的子节点的值。如果它小于子节点的值,就将它和最大的子节点交换位置,然后继续向下调整,直到满足堆的性质。例如,对于节点i,它有左子节点2i + 1和右子节点2i+2(如果存在),我们比较arr[i]arr[2i + 1]arr[2i + 2]的值,将arr[i]与最大的子节点交换位置。

2. 排序过程

        当构建好初始堆后,堆顶元素就是数组中的最大值。我们将堆顶元素arr[0]与数组的最后一个元素arr[n - 1]交换位置,此时最大值就被放到了数组的末尾。

        然后,我们将剩下的n - 1个元素重新构建成一个堆,因为此时堆顶元素可能不满足堆的性质了。我们再次从根节点开始调整堆,使得剩余元素仍然是一个最大堆。

        重复上述交换和调整堆的步骤,每次将当前堆中的最大值放到数组的已排序部分的末尾,直到整个数组都被排序。

四、示例

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < n and arr[l] > arr[largest]:
        largest = l
    if r < n and arr[r] > arr[largest]:
        largest = r
    if largest!= i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)


def heap_sort(arr):
    n = len(arr)
    # 构建最大堆
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)
    # 逐个提取元素进行排序
    for i in range(n - 1, 0, -1):
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)
    return arr

arr = [12, 11, 13, 5, 6]
sorted_arr = heap_sort(arr)
print("排序后的数组:", sorted_arr)

在这个示例中,heapify函数用于调整堆,heap_sort函数用于实现整个堆排序的过程。首先通过heapify函数构建最大堆,然后通过交换堆顶元素和数组末尾元素,并重新调整堆的方式实现排序

五、应用场景

1. 优先级队列相关场景

        任务调度系统:在多任务的系统中,不同的任务具有不同的优先级。例如,操作系统中的进程调度、后台服务中的任务管理等。可以使用堆来构建优先级队列,每次从堆中取出优先级最高的任务进行执行,确保高优先级的任务能够优先得到处理。比如,在一个视频编辑软件的后台,有多个视频渲染任务同时进行,高分辨率、紧急需求的视频渲染任务优先级更高,使用堆可以高效地管理这些任务的执行顺序

        实时消息系统:在即时通讯、实时通知等应用中,消息的优先级可能不同。比如,重要的系统通知、用户的紧急消息等需要优先展示给用户。可以利用堆来管理消息队列,将高优先级的消息排在堆的顶部,以便及时处理和展示

2. TopK 值问题

        在数据量较大的情况下,需要快速找到数据集中的前 K 个最大或最小的值。例如,在搜索引擎中,需要找出搜索频率最高的前 K 个关键词;在数据分析中,需要找出销售额排名前 K 的产品等。使用堆可以在不遍历整个数据集的情况下,快速地找到 TopK 值

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

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

相关文章

分享 pdf 转 word 的免费平台

背景 找了很多 pdf 转 word 的平台都骗进去要会员&#xff0c;终于找到一个真正免费的&#xff0c;遂分享。 网址 PDF转Word转换器 - 100%免费市面上最优质的PDF转Word转换器 - 免费且易于使用。无附加水印 - 快速将PDF转成Word。https://smallpdf.com/cn/pdf-to-word

llama-cpp模型轻量化部署与量化

一、定义 定义配置环境遇到的问题&#xff0c;交互模式下模型一直输出&#xff0c;不会停止模型量化Qwen1.5-7B 案例demo 二、实现 定义 主要应用与cpu 上的部署框架。由c完成。配置环境 https://github.com/ggerganov/llama.cpp https://github.com/echonoshy/cgft-llm/blo…

2024最新版JavaScript逆向爬虫教程-------基础篇之Proxy与Reflect详解

目录 一、监听对象的操作二、Proxy基本使用2.1 创建空代理2.2 定义捕获器2.2.1 Proxy的set和get捕获器2.2.2 Proxy(handler)的13个捕获器 三、Reflect的作用3.1 Reflect的使用3.2 Reflect其余方法(9个)3.3 Proxy与Reflect中的receiver参数3.4 Reflect中的construct方法 ECMAScr…

Ceph层次架构分析

Ceph的层次结构可以从逻辑上自下向上分为以下几个层次&#xff1a; 一、基础存储系统RADOS层 功能&#xff1a;RADOS&#xff08;Reliable Autonomic Distributed Object Store&#xff09;是Ceph的底层存储系统&#xff0c;提供了分布式存储的核心功能。它是一个完整的对象存…

webpack指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;webpack篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack-指南 概念 中文&#xff1a; webpack | webpack中文文档 | webpack中文网 英文&…

网站架构知识之nginx第三天(day026 )

1.状态模块 使用方法&#xff1a;location /status/{ stub_$status; } 任意一个虚拟主机添加这个&#xff0c;就可以查看nginx状态。 对应指标及其说明

新的恶意软件活动通过游戏应用程序瞄准 Windows 用户

一种新的恶意软件 Winos4.0 被积极用于网络攻击活动。FortiGuard实验室发现&#xff0c;这种先进的恶意框架是从臭名昭著的 Gh0strat 演变而来的&#xff0c;配备了模块化组件&#xff0c;可在受感染的设备上进行一系列恶意活动。 这些攻击已在游戏相关应用程序中发现&#xf…

Redis - 集群(Cluster)

一、基本概念 上述的哨兵模式,提⾼了系统的可⽤性.但是真正⽤来存储数据的还是master和slave节点.所有的数 据都需要存储在单个master和slave节点中. 如果数据量很⼤,接近超出了master/slave所在机器的物理内存,就可能出现严重问题了. 如何获取更⼤的空间?加机器即可!所谓&q…

WebRTC项目一对一视频

开发步骤 1.客户端显示界面 2.打开摄像头并显示到页面 3.websocket连接 4.join、new-peer、resp-join信令实现 5.leave、peer-leave信令实现 6.offer、answer、candidate信令实现 7.综合调试和完善 1.客户端显示界面 步骤&#xff1a;创建html页面 主要是input、button、vide…

启动本地开发环境(自带热启动)yarn serve

文章目录 1. 安装 Yarn使用 npm 安装 Yarn使用 Chocolatey 安装 Yarn&#xff08;Windows 用户&#xff09;使用 Homebrew 安装 Yarn&#xff08;macOS 用户&#xff09; 2. 安装项目依赖3. 启动项目开发模式启动生产模式启动 4. 构建项目开发模式构建生产模式构建 5. 其他常用…

SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)

目录 六、Consul服务注册和发现 1.基本介绍 2.下载运行 3.服务注册与发现 &#xff08;1&#xff09;支付服务provider8001注册进consul &#xff08;2&#xff09;修改订单服务cloud-consumer-order80 4.CAP &#xff08;1&#xff09;CAP理论 &#xff08;2&#x…

SAP ABAP开发学习记录——报表选择界面初始值

程序中定义选择界面的部分只是创建输入框&#xff0c;在后续使用中需要自行添加搜索条件&#xff0c;而有关时间或者日期这种&#xff0c;希望自动创建一个默认值&#xff0c;有两种方法&#xff0c;一种是在选择界面初始化时增加语句另外一种是通过在选择界面创建变式实现。 …

16.UE5拉怪机制,怪物攻击玩家,伤害源,修复原视频中的BUG

2-18 拉怪机制&#xff0c;怪物攻击玩家、伤害源、黑板_哔哩哔哩_bilibili 目录 1.实行行为树实现拉怪机制 1.1行为树黑板 1.2获取施加伤害对象&#xff08;伤害源&#xff09; 2.修复原视频中&#xff0c;第二次攻击怪物后&#xff0c;怪物卡在原地不动的BUG 3.怪物攻击玩…

大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Vue3 笔记 (万字速通)

此笔记来至于尚硅谷&#xff0c;仅供笔者复习使用 1. Vue3 简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n&#xff09; 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Rele…

Linux基础1

Linux基础1 Linux基础1学习笔记 ‍ 声明&#xff01; ​​​学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

320页PDF | 集团IT蓝图总体规划报告-德勤(限免下载)

一、前言 这份报告是集团IT蓝图总体规划报告-德勤。在报告中详细阐述了德勤为某集团制定的全面IT蓝图总体规划&#xff0c;包括了集团信息化目标蓝图、IT应用规划、数据规划、IT集成架构、IT基础设施规划以及IT治理体系规划等关键领域&#xff0c;旨在为集团未来的信息化发展提…

乐维网管平台(六):如何正确管理设备端口

一、什么是端口下联 在网络环境中&#xff0c;端口下联是指网络设备&#xff08;通常是交换机&#xff09;的端口与其他设备相连接的一种网络架构关系。交换机作为网络中的核心连接设备&#xff0c;其端口下联可以连接多种类型的终端设备&#xff0c;如计算机、服务器、IP 电话…

迁移学习相关基础

迁移学习 目标 将某个领域或任务上学习到的知识或模式应用到不同但相关的领域或问题中。 主要思想 从相关领域中迁移标注数据或者知识结构、完成或改进目标领域或任务的学习效果。 概述 Target data&#xff1a;和你的任务有直接关系的数据&#xff0c;但数据量少&#xff…