python实现堆排序

堆排序 基本思想:
首先将待排序的记录序列构造成一个堆,此时,选出堆中的最大者即堆顶元素,然后将堆顶记录移除走,并且将剩余的记录再调整成堆,这样又找出了一个次大的元素,以此类推,直到堆中只有一个记录为止。

时间复杂度:O(nlog2n), 这是最好,最坏和平均情况
空间复杂度:O(1)

适用场景:
待排序的数据量比较大时

代码实现:
思路:
先构建一个最大堆, 然后再从这个最大堆中依次取出最大的那个元素,如果是想升序的话,就把最大的元素都取出来,然后逆序一下即可,如果想降序的话直接就是依次取出来的最大的元素。
代码:
python实现堆排序_第1张图片

python实现堆排序_第2张图片
这个是构建堆的代码

然后堆排序的实现是:

python实现堆排序_第3张图片
根节点:i
左孩子:2i
右孩子:2
i+1
在这里解释一下shifUp和shifDown,
shifUp:传入一个待调整元素的下标, 如果这个下标必须大于1,因为下标为0这个元素不是根节点,下标为零这个元素只是我为了方便计算起见设置的一个没有用的节点而已。如果根节点小于待插入节点,那么他们之间交换, 并且更新一下下标,这个为什么要更新一下下标呢??,这个你需要代入几个数字进去计算一下就知道了
shifDown:首先判断根节点的左孩子存在否,在判断一下右孩子存在否,比较左右孩子节点,看看到底哪个节点比较大,记录最大的那个节点的下标,然后和新来的根节点比较,看看新来的是不是最大的,如果不是,还需要继续比较,直到为这个新来的元素找到存在的位置才行,最后要更新一下下标,因为比较会进行交换,位置就会变动。

你可能感兴趣的:(python,排序)