zoukankan      html  css  js  c++  java
  • 用python刷算法--堆排序算法

    堆排序算法流程

    将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余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
    
  • 相关阅读:
    团队项目
    四则运算
    关于软件工程的问题
    自我介绍
    各种排序
    2017年03月14日 新模块投产日记
    第一发和技术无关的博客
    分享一款好用的PHP下ID混淆插件
    批量抓取cisco设备配置脚本编写(expect/sed/awk/shell)
    ntp/heartbeat/postfix/dns故障处理记录
  • 原文地址:https://www.cnblogs.com/kainhuck/p/12972611.html
Copyright © 2011-2022 走看看