堆排序,桶排序和排序总结

本文深入探讨了大根堆的构建与删除最大元素的过程,详细阐述了其时间复杂度,并通过实例解释了如何将最大元素删除并保持堆性质。此外,还提到了基于大根堆的排序算法,如堆排序,以及其复杂度分析。同时,讨论了不同数据状况下适用的排序算法,如计数排序和桶排序,强调了根据数据特性选择合适排序方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每次都和父去比是否大于父,大于的话就交换,然后再跟原父类和现父类比较如果大就交换这样就是一直是大根堆了,如下图列子(heapsize这里记录的当前个数)
在这里插入图片描述

如下图向把最大的6删掉的话,就先把6记录下来然后把最后一个数4移到顶的位置也就是0的位置,然后去和左孩子和右孩子里选一个最大的去和0比如果大就交换。如果下面还有数子的话那就重复操作左孩子和右孩子选出最大和父对比直到父数比左孩子和右孩子大停止操作。
在这里插入图片描述
如下图列子
在这里插入图片描述
先删除9把1的位置换到9的位置然后用标记的hs–断连交换之后9和数组的关系,然后和左孩子和右孩子推选出最大的和1比较比他大就交换知道没有左右孩子或者比左右孩子大。
在这里插入图片描述
代码如下
在这里插入图片描述
在这里插入图片描述

whlie判断是否有左孩子或者下方是否有孩子
接下来的largest的left+1也就是有孩子<heapSize是否有右孩子&&右孩子是否大于左孩子true的话就left+1也就是右孩子赋值给largest不符合的话就left赋值给largest。
接下来就是父和较大的孩子之间谁的大,就把下表给largesat
if语句就是判断是否和父值一样,一样则跳出循环
swap把largesat下标和index下标交换
最后left恢复初始

复杂度

在这里插入图片描述
1节点就是1高度,2节点和三节点也就是2高度,3.4.5.6.7节点也就是3高度以此类推
如果数组右N个数据也就是节点那么他的复杂度也就是0(logn)级别
在这里插入图片描述
上图删除最大数并且把他变成大根堆只会碰所经历的节点其余的不会碰那么他的复杂度也就是O(logn)级别

栈排序

在这里插入图片描述
上图删除最大数然后和最后一个数交换然后heapsize–删除掉最大数和数组的联系然后和左右孩子对比,那个大就交换直到这个数下面没有孩子或者比左右孩子大,然后又删除最大的数和最后一个数交换以此类推
在这里插入图片描述
在这里插入图片描述
上图假设有2N后N个复杂夫logN所以整个代码的复杂度就是0(nlogn),额外空间复杂度O(1)
在这里插入图片描述
如上图如果一次全部给你了数据,要从最后一个点检查heaoify但是并没有左右孩子所以跳过到倒数第二个也是一样没有,所以代表现在就是按顺序排的了,然后直到三个节点组成的小树heaoify求出左右孩子较大的和这个父比较打的话就交换这样就也保证了目前小树的顺序,以此类推和后面的大树也是一样的效果
在这里插入图片描述
在这里插入图片描述
只要改for就行了单纯搞大根堆就用这个会快一点点
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
弹出后面的数往前推
在这里插入图片描述
重要:如上图如果你在系统堆里改一个已经排好的大根堆修改一个数据,系统的堆回去一个个扫描会影响效率,这个时候只能自己手写的堆才能掌控你什么地方改了就从那个地方开始heaoify
在这里插入图片描述
上图就是题目的解答

比较器

升序
在这里插入图片描述

在这里插入图片描述
降序
在这里插入图片描述
自己添加比较器让黑盒变成大根堆
在这里插入图片描述
在这里插入图片描述

桶排序

计数排序

在这里插入图片描述
一个年龄的数组,算年龄有0~200岁所以创建一个201的容器,然后下标代表年龄数据代表个数也就是原始数组算出个数,所以时间复杂度就是0(N),如果不是年龄是一个很大的范围就不理智了,所以不继续比较的排序,都是根据分析数据状况做的排序来定制的,他没有继续比较的排序有那么广的应用范围

基础排序

在这里插入图片描述
[72,13,25,100,17] 然后看十进制来算位数补齐也就是变成了[072,013,025,100,017],然后按照最后一位数放入桶中,然后取出,先进先出
在这里插入图片描述
然后按照十位数放入桶中
在这里插入图片描述然后按照百位数放入桶中,但是基数排序还是根据数据状况,这个状况就是数据要有进制的限制
在这里插入图片描述
maxbits就是找最大值
max = 系统最小
然后遍历找到最大值
最大值/10 res个数是最大的值有几个十进制位
在这里插入图片描述
在这里插入图片描述

digit表示这一批中最大的值有几个十进制位
radix表示10为基底
接下来的for:d如果为一的话就取出个位,为2的话取出百位以此类推
接下来的fot:代表的是下标的
接下来的for:数组从右往左遍历每一个数根据到了第几位把那个位的数拿出来,然后根据count-1填写到数组然后–这就是出桶
接下来的for:就是bucket的数子导入arr里相当于维持了这次出桶的结果等待下一次出桶入桶
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值