首页 > 编程语言 > 详细

用python刷算法--堆排序算法

时间:2020-05-27 14:46:46      阅读:44      评论:0      收藏:0      [点我收藏+]

堆排序算法流程

将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小顶堆:arr[i] ? arr[2i+1] && arr[i] ? arr[2i+2]

用python实现

def heapSort(intList: [int]) -> None:
    end = len(intList) - 1
    while end >= 0:
        # 进行大顶堆的构造
        heap(intList, end)
        # 交换第一个与最后一个的位置
        intList[0], intList[end] = intList[end], intList[0]
        end -= 1


def heap(intList: [int], end: int) -> None:
    i = end
    # 判断end是否是孤立
    if end % 2:
        # 孤立
        # 判断end和父元素的大小
        if intList[int((end-1)/2)] < intList[end]:
            intList[int((end-1)/2)
                    ], intList[end] = intList[end], intList[int((end-1)/2)]
        i = end-1

    while i > 0:
        # 判断两个孩纸节点和父元素的大小
        father = intList[int((i-2)/2)]
        leftChild = intList[i-1]
        rightChild = intList[i]
        maxIndex = i if rightChild > leftChild else i-1
        if father < intList[maxIndex]:
            intList[int(
                (i-2)/2)], intList[maxIndex] = intList[maxIndex],  intList[int((i-2)/2)]
        i -= 2

用python刷算法--堆排序算法

原文:https://www.cnblogs.com/kainhuck/p/12972611.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!