堆排补充(是特殊的快排)
。。。解释不清了,对照着堆排初了解的凑合看吧
-
算法思想
了解一波后明白堆排说到底就是两个步骤建堆和整堆的过程了,然后我们来一步步摸清楚。
建堆要大顶堆还是小顶堆呀?我们要明白为什么说大顶堆就是用于递增排序,小顶堆就是降序呢?——这是由于大顶堆排列时将max值排到了树顶点位置,与当前堆最后一个数交换后,max值被排在数组最后一个位置了,从右往左时依次变小的数。
这里讲的堆、完全二叉树数据结构并不真实存在,只是一个帮助我们排序的思考形式,不占用真实内存。依旧是一个待排序的数组序列。
对于在数组中,已知某个元素i的数组下标,那我可以找到它的父节点、左右孩子结点,(i-1)/2的上下取值、2i+1、2i+2.
将待排序序列画成完全二叉树的形式是一个初始堆,但还未完成。这里从堆的最后一个结点开始
做比较 交换(为什么是最后一个结点?因为其实应该从最后一个数开始的,但因为最后一层的点只能和自己比较,没意思,我就不代入了)就这个最后一个结点开始,从右往左,自下而上逐个排查。每一个结点要和它的左右孩子比较,比较后需要交换的就换位置。到了再上一层除了要和孩子结点比较交换,还会出现一个问题就是,会影响这个树了下一层顺序,所以是个下沉的排查。这里分析规律
如图:
知道每一层的数量变化后呢?怎么联系到总消耗时间? -
例子
-
时间复杂度
分析: -
java代码
在这里插入代码片