【A-排序】python实现八大排序算法之6-堆排序(Heap Sort)

堆排序(Heap Sort)

堆排序 由二叉堆的定义可知,堆顶元素(即二叉堆的根节点)一定为堆中的最大值或最小值,因此如果我们输出堆顶元素后,将剩余的元素再调整为二叉堆,继而再次输出堆顶元素,再将剩余的元素调整为二叉堆,反复执行该过程,这样便可输出一个有序序列,这个过程我们就叫做堆排序。

'''
Creat by HuangDandan
2018-08-15
[email protected]

思想:
每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列

步骤:
堆排序步骤:
1-将数据构建成堆,这里的堆指完全二叉树(不一定是满二叉树)
2-将堆调整为最小堆或最大堆
3-此时堆顶已经为最大数或最小数,可以对下面的分支堆再进行调堆即可,此处采用的是将堆顶数取出,再调堆

难点:
1-如何将一个无序序列建成一个二叉堆
2-在把堆顶元素和栈尾元素交换后,如何将剩余的元素调整为一个二叉堆

'''


'''
def HeapAdjustDown(Lst, start, end):
    temp = Lst[start]   # temp保存当前结点
    child = 2*start + 1   # 2*start+1为序号为start的结点的左子结点编号

    while child <= end:
        #找到推中的叶子节点 左右节点中最大的那个
        if child+1 <= end and Lst[child+1] > Lst[child]:
            child += 1
        #当前的结点复合最大堆的定义,则不用调整位置,跳出循环
        if Lst[child] <= temp:
            break

        Lst[start], Lst[child] = Lst[child], Lst[start]

        start = child

def HeapSort(Lst):
    #将数组建立成最大的堆
    #第一个非叶子结点的位置 lem(lst)//2-1
    for child in range(len(Lst)//2-1, -1, -1):
        HeapAdjustDown(Lst, child, len(Lst)-1)


    for child in range(len(Lst)-1,0,-1):
        Lst[0],Lst[child] = Lst[child], Lst[0]
        #将Lst[0,…,i-1]重新调整为最大堆
        HeapAdjustDown(Lst,0,child-1)


if __name__ == "__main__":
    Lst1 = [1,4,5,2,55,44,66,77,66,66,88,1]
    print(Lst1)
    HeapSort(Lst1)
    print(Lst1)
    print("----------------------------------------")

参考博客:
https://blog.csdn.net/ns_code/article/details/20227303 C++进行堆排序编程
https://segmentfault.com/a/1190000006546190?_ea=1082148 具体的python程序
https://www.cnblogs.com/chengxiao/p/6129630.html 具体的python程序
https://www.jb51.net/article/123676.htm

猜你喜欢

转载自blog.csdn.net/u010591976/article/details/81810039