算法训练营(二):堆排序

堆排序过程


  1. 建立大顶堆或者小顶堆,大顶堆(一种二叉树型结构,子树节点值都小于父节点的值)。这个过程的要点是:先从最后一个非叶子节点开始构建堆,因为最后一个非叶子节点才有可能需要调整,然后向前查找的节点都有子树,都有可能需要调整。
  2. 排序过程。建立好了大顶堆,那么第一个节点,肯定是所有节点中值最大的节点,所以把第一个节点和最后一个节点值互换。那么最大的节点就在最后了。这个时候需要重新调整的节点为第一个节点,而不需要像构建大顶堆那样从最后一个非叶子节点开始,因为除了第一个节点以外,其他的节点都是子树节点小于父节点,所以是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

猜你喜欢

转载自blog.csdn.net/yrx0619/article/details/83376619