首先,了解堆的定义:堆是这样一种类似于完全二叉树的数据结构,要求双亲结点的值比子节点大(或者小)。如果是大,就叫[b]大根堆[/b];如果小,就是[b]小根堆[/b]。由此,根节点一定是最大数或者最小数。
这样,算法就分为下面几个步骤:
1. 把序列整理成大根堆
2. 把大根堆的根和序列最后一个数交换
3. 把除去最后一个数后剩下的子序列再变成大根堆
4. 重复2和3直到序列的第二个数为止
那么如何把一个序列变成大根堆,这是一个递归算法,大凡树结构相关的算法,递归总是少不了的,因为树本身就是一个递归结构。假设一棵树的左右子树已经是大根堆,那么要把这棵树变成大根堆的过程就是:
1. 在根和他的左右子节点中找到最大值:
2. 如果根就是最大值,什么都不做,这已经是大根堆
3. 如果根不是最大值,就把根和最大值交换位置。
4. 把交换后的那一棵树执行1到4步。
这样,算法就分为下面几个步骤:
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()