python堆排序的库_Python排序之-堆排序

堆排序

堆积排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。

堆是一个近似完全二叉树的结构,并同时满足堆性质:

子结点的键值或索引总是不小于(或者不大于)它的父节

堆总是一棵完全二叉树(Complete Binary Tree)

完全二叉树是由满二叉树(Full Binary Tree)而引出来的。除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树称为满二叉树。 如果除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点,这样的二叉树被称为完全二叉树。

需要注意的是,堆只对父子节点做了约束,并没有对兄弟节点做任何约束,左子节点与右子节点没有必然的大小关系。

如果用数组存储堆中的数据,逻辑结构与存储结构如下:

b330e14deb130d969a6da3597924c6a2.png

堆排序

初始时把要排序的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:

breakif 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值