堆
每次都和父去比是否大于父,大于的话就交换,然后再跟原父类和现父类比较如果大就交换这样就是一直是大根堆了,如下图列子(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里相当于维持了这次出桶的结果等待下一次出桶入桶