07_04.堆排序

孤街浪徒 提交于 2019-12-03 17:41:33
def heap_sort(elems):
    """堆排序"""

    def siftdown(elems, e, begin, end):
        i, j = begin, begin * 2 + 1
        while j < end:
            if j + 1 < end and elems[j + 1] < elems[j]:  # 找elems[j + 1]与elems[j]中较小的
                j += 1
            if e < elems[j]:  # e在三者中最小,已找到了位置
                break
            elems[i] = elems[j]  # elems[j]在三者中最小,上移
            i, j = j, 2 * j + 1
        elems[i] = e

    end = len(elems)
    # 建小顶堆
    for i in range(end // 2, -1, -1):
        siftdown(elems, elems[i], i, end)
    for i in range((end - 1), 0, -1):
        e = elems[i]
        elems[i] = elems[0]  # 取最小元素放到最后
        siftdown(elems, e, 0, i)  # 剩下元素再建小顶堆


e = [1, 3, 6, 4, 5]
heap_sort(e)
print(e)  # [6, 5, 4, 3, 1]
e.reverse()
print(e)  # [1, 3, 4, 5, 6]

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!