又来了,学弟学妹把教材收起来吧,二叉堆看我这篇就妥了

面试官:写一个堆排吧

我心想:堆排是什么鬼

理解堆排,首先要理解二叉堆。理解了二叉堆的“下沉”操作,基本上就可以理解堆排了。今天我们来看一看什么是堆,以及堆的一般操作

一、优先级队列

近日,一尘遇到了烦心事,于是找老师去诉苦了

image-20210425224845867

image-20210425224905039

image-20210425224928734

image-20210425224948150

image-20210425225015893

一尘列了几个要做的事

图片

image-20210425225458794

一尘道出了心中的苦

image-20210425225542581

慧能:你可以做优先级最高的事情,做完后删除它,然后做剩下优先级最高的事,当然,很有可能有其他事插入进来,新插入的事情如果优先级不是最高,就不做,这样你就一直做优先级最高的事了

接着慧能顺手画了一个图

图片

image-20210425225643729

优先级队列中每个元素都有优先级,优先级最高的最先被处理

二、优先级队列的实现

image-20210425225939826

一尘非常想知道黑盒里面是什么

image-20210425230032404

image-20210425230054951

图片

然后我把优先级存入一个无序数组里,取出的时候遍历数组一边,找出最小值,插入的时候直接插到集合末尾

图片

image-20210425230159593

image-20210425230223102

image-20210425230300367

一尘画了一幅图解释道

图片

随后,一尘又画出了插入6后的图

图片

image-20210425230358440

image-20210425230424386

image-20210425230453834

三、堆

image-20210426001012932

image-20210426001037009

这里我们只讨论二叉堆,把二叉堆称为堆,堆也有d-堆,左式堆等等

image-20210426002835380

慧能看一尘不是很明白,顺手画了个图

图片

image-20210426003007342

慧能画了一个二叉堆实例

图片

image-20210426003044166

注意:二叉堆中两个孩子之前的大小没有关系,可能左孩子>=右孩子,也可能右>=左

image-20210426004642615

慧能随手画了一个小根堆和一个大根堆

图片

本文讨论小根堆

image-20210426004740554

image-20210426004801366

图片

image-20210426011001526

图片

image-20210426011051201

图片

image-20210426011118065

image-20210426011138841

4、插入操作

image-20210426011232323

每个父节点的值小于等于其左右孩子的值被称为堆的有序性,另一种情况是大于等于也称之为堆的有序性

慧能随手画了一个插入操作破坏堆有序性的图

图片

image-20210426015048086

image-20210426015112244

图片

image-20210426015140482

image-20210426015158804

图片

image-20210426015223003

说完,慧能飞速地写出了上浮的代码

图片

一尘暗自惊叹老师的代码功力

五、删除操作

image-20210426015323808

一尘听完此话紧张的手心出汗,但还是硬着头皮想了想,突然灵光一现

image-20210426015358952

图片

image-20210426015448992

随后一尘画出了交换后的图

图片

image-20210426015517299

image-20210426015536445

image-20210426015635525

image-20210426015655086

image-20210426015712366

图片

image-20210426015828550

image-20210426015902820

图片

image-20210426015936252

图片

image-20210426020004353

图片

image-20210426020024216

image-20210426020122970

一尘刚松了口气,谁知还要写代码,只见一尘想了想,写写擦擦好几遍最终写下了如下代码

图片

image-20210426020208671

如图

图片

image-20210426020254004

只见一尘又写了一段代码

图片

leftIndex = 2*parentIndex;

rightIndex = 2*parentIndex+1;

image-20210426020339549

图片

image-20210426020407620

image-20210426020535040

看来以后得好好学数据结构与算法了,不然连时间都管理不好,一尘心想

另外,算法的学习也是必经之路,这里给大家推荐一个大佬的刷题笔记

image.png
帅地校招就是刷了这份笔记来应付面试官的,这里分享给大家吧。
下载链接:BAT大佬的刷题笔记太经典

把这份笔记突击学习一下,很多算法考察,基本都稳了

另外,再给大家推荐一份某大佬的 leetcode 刷题笔记,汇聚了上千道 leetcode 题解,并且代码都是 beat 100%:

下载链接:leetcode 分类题解(最优解)

就算你现在不学算法,那么这份笔记也值得你收藏,万一有人问你 Leetcode 某道题解,或者有大神在讨论题解,咱打开这份笔记,不管三七二十一,直接把最优解扔给他,然后退出群聊

额外话

堆排序的实现就是基于二叉堆的,堆排序是十大排序算法中必学的一种排序算法,这里帅地给大家找来了优质的学习文章供大家学习,网上其他文章质量参差不齐,详细经过帅地挑选的这些文章能够节省你不少时间
漫画:什么是冒泡排序算法?

漫画:什么是选择排序算法?

漫画:什么是插入排序算法?

漫画:什么是希尔排序算法?

漫画:什么是归并排序算法?

漫画:什么是快速排序算法?

漫画:什么是堆排序算法?

漫画:为什么说O(n)复杂度的基数排序没有快速排序快?

什么是计数排序算法?

十大排序算法极简汇总篇

作者简洁

作者:大家好,我是帅地,从大学、自学一路走来,深知算法计算机基础知识的重要性,公众号「帅地玩编程」10万粉丝作者,专业于写这些底层知识,提升我们的内功,帅地期待你的关注,和我一起学习,点击了解我四年大学学 习之路 转载说明:未获得授权,禁止转载

  • 88
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值