堆和堆排序

堆排序是一种与插入排序和并归排序十分不同的算法。

优先级队列

Priority Queue

优先级队列是类似于常规队列或堆栈数据结构的抽象数据类型(ADT)。优先级队列中的每个元素都有一个相关联的优先级key。在优先级队列中,高优先级的元素优先于低优先级的元素。

虽然优先级队列通常使用堆heap实现,但它们在概念上与堆不同。优先级队列是一种抽象的数据结构,如列表或映射; 正如列表可以用链表或数组实现一样,优先级队列也可以用堆或其他方法(如有序数组)实现。

Heap

堆可以理解为由一个由数组来顺序存储的完全二叉树。

最大堆:任意节点的key  子节点的key

类似的

最小堆:任意节点的key  子节点的key

以最大堆为例,来讲解

最大堆

最大堆的操作

build_max_heap:根据一个未排序的数组生成一个最大堆

max_heapify: 如果子树的根节点违反最大堆的特性,就对其进行纠正。假设左右子树都是最大堆

build_max_heap的伪代码:

for i = n/2 down to 1
    do max_heapify(A,i)

max_heapify和build_max_heap的时间复杂度

对叶子结点上面一层的结点(level 1)进行max_heapify是O(1)的时间复杂度

对叶子结点上面i层 level i 的结点进行max_heapify是O(i)

n/4个结点是level 1,n/8个结点是level 2,n/16个结点是level 3  ... 1个结点是level logn

因此max_heapify的时间复杂度为O(logn),可计算出build_max_heap的时间复杂度为O(n)

计算过程在最底下,使用错位相减法。

堆排序步骤

1.根据一个未排序的数组来创建最大堆

2.找到最大元素A[1]

3.交换元素A[n]和A[1],现在最大元素位于堆的尾部

4.移除A[n](最大元素),只需将存放堆的数组的大小减1

5.经过交换元素之后的堆也许违背了最大堆的定义,但是A[1]的孩子仍然是最大堆,因此进行max_heapify,经过修正后,整个堆就是最大堆;重复步骤2-5,n次。

class Solution {
public:
    //堆是一个完全二叉树,因此适合使用顺序存储的方式。
    //堆排序步骤:
    //1.根据一个未排序的数组来创建最大堆
    //2.找到最大元素A[1]
    //3.交换元素A[n]和A[1],现在最大元素位于堆的尾部
    //4.移除A[n](最大元素),存放堆的数组的大小减1
    //5.经过交换元素之后的堆也许违背了最大堆的定义,但是A[1]的孩子仍然是最大堆,因此进行max_heapify,经过修正后,整个堆就是最大堆;重复2-5,n次

    //时间复杂度O(nlogn)
    vector<int> sortArray(vector<int>& nums) {
        build_max_heap(nums);
        //堆排序
        int n = nums.size();
        while(n > 0)
        {//重复n次
            //找到最大元素,并与堆末尾元素进行交换
            int max_elem = nums[0];
            nums[0] = nums[n-1];
            nums[n-1] = max_elem;
            --n;//移出末尾元素
            //进行max_heapify
            max_heapify(nums, 0, n);
        }
        return nums;
    }

    void build_max_heap(vector<int>& nums)
    {
        int size = nums.size();
        for(int i = size/2-1;i >= 0;--i)
        {
            max_heapify(nums, i, size);
        }
    }

    void max_heapify(vector<int>& nums, int i, int size)
    {//将A[i]修正为最大堆
        //A[i]的左孩子为A[2i+1],右孩子为A[2i+2]
        int left = (i<<1) + 1;
        int right = left + 1;
        int large = left;//默认较大元素为左节点
        while(large < size)
        {
            if(right < size && nums[right] > nums[left])
            {//假如右结点大于左节点
                large = right;//记右结点为较大的
            }
            if(nums[i] < nums[large])
            {//假如父节点小于左右结点中较大的结点
                //将父节点与较大的结点进行交换,从而使父节点大于左右子结点,符合最大堆的约束
                int tmp = nums[i];
                nums[i] = nums[large];
                nums[large] = tmp;
                i = large;//i调节为其子结点large
                large = (i<<1)+ 1;//large调整为i的左子节点
            }
            else
            {
                break;
            }
        }
    }

};

a5539b6c1e904c54b02635c72de394f3.jpeg 

508b08f84d6544f09beac54f5af49812.jpeg4ee4738aefc642a0b2703ea4d8ca7b48.jpeg

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“2024杭州智慧城市及安防展会”将于4月在杭州博览中心盛大召开

2024杭州国际智慧城市及安防展览会&#xff0c;将于4月24日在杭州国际博览中心盛大开幕。这场备受瞩目的盛会&#xff0c;不仅汇集了全球智慧城市与安防领域的顶尖企业&#xff0c;更是展示最新技术、交流创新理念的重要平台。近日&#xff0c;从组委会传来消息&#xff0c;展会…

电脑开机黑屏解决方案,让我来告诉你

在使用电脑的日常操作中&#xff0c;遇到电脑开机后却只看到一片黑屏可能是一种相当令人困扰的情况。这种问题可能出现在不同的电脑和操作系统中&#xff0c;给用户带来了一定的困扰。在本文中&#xff0c;我们将深入探讨电脑开机黑屏的可能原因以及解决方法&#xff0c;帮助您…

解决方案:Python画图汉字丢失显示小方块

解决方案&#xff1a; linux python解决中文字体 - jingsupo - 博客园 (cnblogs.com) 在找字体缓存文件的时候我找了一会儿&#xff0c;我的路径是这里&#xff1a; 做了所有更改之后&#xff0c;最后一定要把缓存文件删掉&#xff0c;不然还是会报同样的错误的。 这里再贴一…

挑花眼?这样选Six Sigma咨询公司,轻松又靠谱

近年来&#xff0c;市场上涌现出众多的Six Sigma咨询公司&#xff0c;它们各自标榜着专业、高效、经验丰富等标签&#xff0c;让人眼花缭乱&#xff0c;难以抉择。面对这样的情境&#xff0c;企业或个人在选择合作伙伴时难免会感到头大。那么&#xff0c;如何在众多选项中挑选出…

聊一聊ThreadLocal的原理?

1.ThreadLocal创建方式 ThreadLocal<String> threadlocal1 new ThreadLocal(); ThreadLocal<String> threadlocal2 new ThreadLocal(); ThreadLocal<String> threadlocal3 new ThreadLocal(); 2.首先介绍一下&#xff0c;ThreadLocal的原理&#xff1a; 如…

易点易动固定资产管理系统如何为企业固定资产管理保驾护航

固定资产作为企业重要的资产组成部分,它直接影响企业的资金流动和经营发展。然而在传统的管理模式下,固定资产管理效率低下、盲区众多,资产利用率和价值体现不佳。易点易动智能化固定资产管理系统应运而生,为企业固定资产管理保驾护航,帮助企业实现资产高效管控、规避经营风险。…

CubeMX使用教程(2)——点亮LED

在上一章&#xff0c;我们完成了CubeMX的环境配置&#xff0c;这一章我们通过CubeMX来完成点亮LED的工作。 通过LED原理图可知&#xff0c;如果我们要点亮LD1&#xff08;第一个灯&#xff09;&#xff0c;它对应开发板的PC8端口&#xff0c;因此我们应该在CubeMX中将PC8配置为…

『 Linux 』Process Control进程控制(万字)

文章目录 &#x1f996; 前言&#x1f996; fork()函数调用失败原因&#x1f996; 进程终止&#x1f4a5; 进程退出码&#x1f4a5; 进程正常退出 &#x1f996; 进程等待&#x1f4a5; 僵尸进程&#x1f4a5; 如何解决僵尸进程的内存泄漏问题&#x1f4a5; wait( )/waitpid( )…

高中数学:初等函数之幂函数

1、定义 注意&#xff1a;x项系数&#xff0c;只能是1&#xff01; 例题&#xff1a; 2、常见幂函数图像 3、分数指数幂 x定义域&#xff1a;分母为偶数时&#xff0c;如&#xff1a;2、4、6等&#xff0c;则x≥0 x≥0时 4、画草图 步骤&#xff1a; 1、利用结论画出第…

2024最新图标设计趋势!附超好用的图标工具清单

图标&#xff0c;在界面设计中的作用不容小觑。正所谓浓缩的就是精华&#xff0c;一个小小的图标&#xff0c;却有着高效传递信息、美化界面排版、提升用户体验的巨大能力。 既然图标如此重要&#xff0c;了解图标设计趋势对设计师来说几乎是必须要做的事&#xff0c;它可以让…

字符串索引错误解决方案

字符串索引错误通常是由于尝试访问字符串中不存在的索引位置而引起的。我在Python编译中&#xff0c;字符串是一个不可变的序列&#xff0c;可以通过索引访问其中的字符。如果尝试访问超出字符串长度范围的索引位置&#xff0c;将引发IndexError异常。所以下面的问题如果遇到了…

阿里云k8s内OSS报错UnKnownHost。

这个问题就是链接不上oss属于网络问题&#xff1a; 1.排查服务器 在服务器&#xff08;ecs&#xff09;上直接ping oss地址看是否能够通。 不通就要修改dns和hosts&#xff08;这个不说&#xff0c;自己网上查&#xff09; 2.排查容器 进去ping一下你的容器是否能访问到oss…

新能源车高压线束更换VR虚拟互动教学保障了培训安全可控

随着新能源汽车市场的快速发展&#xff0c;对于新能源汽车检修人才的需求也日益增长。然而&#xff0c;传统的培训模式往往存在一些限制&#xff0c;如培训周期长、成本高、实践机会少等。为了解决这些问题&#xff0c;新能源车检修VR互动培训应运而生&#xff0c;成为一种创新…

电脑怎么强制关机?让电脑不再“任性”!

在使用电脑的过程中&#xff0c;有时可能会遇到程序无响应、系统崩溃或遭遇恶意软件攻击等情况&#xff0c;这时就需要我们采取紧急措施&#xff0c;强制关闭电脑。强制关机虽然是一种非常手段&#xff0c;但在必要时能够保护电脑硬件和数据安全。本文将为您介绍电脑怎么强制关…

智慧视频终端解决方案

依托富瀚微智慧视频SOC&#xff0c;提供以视频为核心的智能产品及解决方案

【数据结构与算法】二分查找题解(二)

这里写目录标题 一、81. 搜索旋转排序数组 II二、167. 两数之和 II - 输入有序数组三、441. 排列硬币四、374. 猜数字大小五、367. 有效的完全平方数 一、81. 搜索旋转排序数组 II 中等 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递…

搞钱必看 盘点那些靠谱的程序员副业,狠狠提升财富值

这是一个职业生涯三叶草模型&#xff0c;它分为兴趣、价值、能力三个维度&#xff0c;完美的主职业最好同时满足这三项。但事情往往未必那么如意&#xff0c;如果主职业没能同时满足&#xff0c;那么剩下的部分&#xff0c;完全可以用副业填充。 或者&#xff0c;通俗点说&…

蓝牙耳机怎么选择比较好?2024年热门机型推荐大揭秘!

​蓝牙耳机已经成为了我们日常生活中不可或缺的一部分&#xff0c;随着技术的发展&#xff0c;人们对蓝牙耳机的要求也在不断提升&#xff0c;不仅希望音质出色&#xff0c;还希望能够在不同的场景下使用。然而&#xff0c;如何挑选一款适合自己的蓝牙耳机却是一门学问。今天&a…

基于ACM32 MCU的电动滑板车方案介绍

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…

stm32学习笔记:I2C通信外设原理+实验

软件实现和硬件实现 串口通信为异步时序&#xff0c;用软件实现很麻烦&#xff0c;基本上用硬件实现 而I2C协议通信为同步时序&#xff0c;软件实现简单且灵活&#xff0c;硬件实现比较麻烦&#xff0c;故软件比较常用 但I2C硬件实现功能比较大&#xff0c;执行效率高&#xff…