堆排序 - python 实现

首先,了解堆的定义:堆是这样一种类似于完全二叉树的数据结构,要求双亲结点的值比子节点大(或者小)。如果是大,就叫[b]大根堆[/b];如果小,就是[b]小根堆[/b]。由此,根节点一定是最大数或者最小数。
这样,算法就分为下面几个步骤:
1. 把序列整理成大根堆
2. 把大根堆的根和序列最后一个数交换
3. 把除去最后一个数后剩下的子序列再变成大根堆
4. 重复2和3直到序列的第二个数为止

那么如何把一个序列变成大根堆,这是一个递归算法,大凡树结构相关的算法,递归总是少不了的,因为树本身就是一个递归结构。假设一棵树的左右子树已经是大根堆,那么要把这棵树变成大根堆的过程就是:
1. 在根和他的左右子节点中找到最大值:
2. 如果根就是最大值,什么都不做,这已经是大根堆
3. 如果根不是最大值,就把根和最大值交换位置。
4. 把交换后的那一棵树执行1到4步。


#python heap sort
def exchange(i, j):
x = array[i]
array[i]=array[j]
array[j]=x

def maxHeapify(end,i):
l=2*i+1
r=2*(i+1)
max=i
if l<end and array[i]<array[l]:
max=l

if r<end and array[max]<array[r]:
max=r

if max <> i:
exchange(i,max)
maxHeapify(end,max)

def buildMaxHeap():
end=array.__len__()
start=end/2-1
for i in range(start,-1,-1):
maxHeapify(end,i)

def heapSort():
print array
end=array.__len__()
buildMaxHeap()
print array
for i in range(end-1,0,-1):
exchange(i,0)
maxHeapify(i,0)
print array

array=[2,5,3,10,8]
heapSort()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值