堆排序过程
- 建立大顶堆或者小顶堆,大顶堆(一种二叉树型结构,子树节点值都小于父节点的值)。这个过程的要点是:先从最后一个非叶子节点开始构建堆,因为最后一个非叶子节点才有可能需要调整,然后向前查找的节点都有子树,都有可能需要调整。
- 排序过程。建立好了大顶堆,那么第一个节点,肯定是所有节点中值最大的节点,所以把第一个节点和最后一个节点值互换。那么最大的节点就在最后了。这个时候需要重新调整的节点为第一个节点,而不需要像构建大顶堆那样从最后一个非叶子节点开始,因为除了第一个节点以外,其他的节点都是子树节点小于父节点,所以是
Max_Heapify(heap,0,i)
,树长度为n-1,因为最后一个节点为最大节点,不需要再调整了,否则又会调整到第一个节点了。
代码实现
#/usr/bin/python
#coding:utf8
def Max_Heapify(heap, root, n):
left = 2 * root + 1
right = left + 1
if left < n and heap[left] > heap[root]:
┆ heap[left], heap[root] = heap[root], heap[left]
┆ Max_Heapify(heap,left, n)
if right < n and heap[right] > heap[root]:
┆ heap[right], heap[root] = heap[root], heap[right]
┆ Max_Heapify(heap, right, n)
def Build_Heap(numlist):
n = len(numlist)
for i in range((n//2 - 1),-1, -1):
┆ Max_Heapify(numlist, i, n)
def sort(heap):
n = len(heap)
for i in range(n-1,-1, -1):
┆ heap[0], heap[i] = heap[i], heap[0]
┆ Max_Heapify(heap,0,i)
heap = [4,6,8,5,9]
Build_Heap(heap)
sort(heap)
print heap
参考:
https://blog.csdn.net/minxihou/article/details/51850001
https://www.cnblogs.com/chengxiao/p/6129630.html