Python排序之-堆排序
Posted 诺禾生信
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python排序之-堆排序相关的知识,希望对你有一定的参考价值。
堆排序
堆积排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
堆
堆是一个近似完全二叉树的结构,并同时满足堆性质:
子结点的键值或索引总是不小于(或者不大于)它的父节
堆总是一棵完全二叉树(Complete Binary Tree)
完全二叉树是由满二叉树(Full Binary Tree)而引出来的。除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树称为满二叉树。 如果除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点,这样的二叉树被称为完全二叉树。
需要注意的是,堆只对父子节点做了约束,并没有对兄弟节点做任何约束,左子节点与右子节点没有必然的大小关系。
如果用数组存储堆中的数据,逻辑结构与存储结构如下:
堆排序
初始时把要排序的n个数看作是一棵顺序存储的完全二叉树,调整它们的存储顺序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依次类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。这个过程就称为堆排序。
先来视觉感受一下堆排序:
或者慢一点的:
python实现
def heap_sort(list): # 创建最大堆 for start in range((len(list) - 2) // 2, -1, -1): sift_down(list, start, len(list) - 1) # 堆排序
for end in range(len(list) - 1, 0, -1):
list[0], list[end] = list[end], list[0]
sift_down(list, 0, end - 1)
return list
# 最大堆调整def sift_down(lst, start, end): root = start while True: child = 2 * root + 1
if child > end:
break
if child + 1 <= end and lst[child] < lst[child + 1]: child += 1 if lst[root] < lst[child]: lst[root], lst[child] = lst[child], lst[root]
root = child
else:
break
以上是关于Python排序之-堆排序的主要内容,如果未能解决你的问题,请参考以下文章