排序算法 (08.堆排序)

什么是堆

1.所有 父节点 的值 都大于 (小于)子节点 的 值
2.属于完全 二叉树

堆排序思路

1.先定义一个调整堆的函数, 保证以 某点为 父节点进行调整, 并且保证 不 打乱 
子节点 以下的 子树的 堆结构 , 所以 用到 递归思想
2.从头遍历 到 树尾, 先进行 首尾交换, 再进行 构建 堆

代码实现


# 堆调整:
def heapify(tree, n, i):
    if i >= n:
        return
    max = i
    c1 = 2*i + 1
    c2 = 2*i + 2
    if tree[c1] and tree[c1] > tree[max]:
        max = c1
    if tree[c2] and tree[c2] > tree[max]:
        max = c2
    if max != i :
        #交换两个值
        tree[max], tree[i] = tree[i], tree[max]
        heapify(tree , n, max)

#build堆
def build_heap(tree, n):
    i = (n - 1) / 2
    while i >= 0:
        heapify(tree, n, i)
        i -= 1
#堆排序
def heap(tree, n):
    for i in range(0, n):
        tree[n-1],tree[0] = tree[0],tree[n-1]
        build_heap(tree, n-1)
原文地址:https://www.cnblogs.com/jackson1/p/12742291.html