堆排序的时间复杂度为:O(nlgn)
def max_heapify(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
def heap_sort(lst):
first = len(lst)
for start in range(first,-1,-1):
max_heapify(lst,start,len(lst)-1)
for end in range(len(lst) - 1 , 0,-1):
lst[0],lst[end] = lst[end],lst[0]
max_heapify(lst,0,end - 1)
return lst
def main():
A = [5,3,17,10,84,19,6,22,9]
print heap_sort(A)
if __name__ == '__main__':
main()
堆
堆数据对象是一种数组对象,它可以看作一颗完全二叉树。
对于一个堆数组A,有两个属性:
1.length[A]:表示数组中元素的个数
2.heap-size[A]:表示数组A中存放的堆元素的个数
树的根为A[1],给定某个结点的下标为i,则
父节点:parent[i] : i/2向上取整
左儿子:left[i]:2i
右儿子:right[i]:2i+1
堆分为:最大堆和最小堆
在堆排序中我们使用最大堆,最小堆一般用于构造优先队列。
堆的一个节点的高度:该节点到叶节点最长简单路径上边的数目
一个包含n个元素的堆的高度为O(lgn)
维护堆性质 MAX-HEAPIFY
MAX-HEAPIFY用于维护最大堆。他的输入为一个数组A和一个下标i。在调用MAX-HEAPIFY的时候,我们假设LEFT(i)和RIGHT(i)的二叉树都是最大堆,但这时候的A[i]有可能小于他的孩子节点。MAX-HEAPIFY就是让A[i]的值在最大堆中逐级下降,从而使得根节点为下标i的字数重新遵循最大堆的性质。
时间复杂度:O(lgn)
对n个元素的堆来说,lg(n)也是一棵树的高度h,MAX-HEAPIFY的时间复杂度是O(h)
建堆
时间复杂度为O(n)
也就是说,我们可以在线性时间内,将无序数组构建为最大堆。