zoukankan      html  css  js  c++  java
  • 算法导论之堆排序

    最大堆:所有根节点的值都比子节点的值大

    最小堆:所有根节点的值都比子节点的值小

    排序步骤:

    将n个元素按顺序排列成完全树,建立最大堆(或最小堆),最大堆排序结果为逆序,最小堆排序结果为顺序。每次取堆顶元素放入一个新数组,取完后将堆顶元素和最后一个元素交换,然后重新建立最大地(或最小堆),取n次,新数组即为有序数组。

    python代码实现堆排序:

    def maxHeapify(lList, nStart, nEnd):
        nDad = nStart
        nSon = nDad*2+1
        while nSon<nEnd:
            if nSon+1<nEnd and lList[nSon+1]>lList[nSon]:
                nSon+=1
            if lList[nSon]>lList[nDad]:
                lList[nSon], lList[nDad]=lList[nDad],lList[nSon]
            else:
                break
            nDad = nSon
            nSon=nDad*2+1
    
    def HeapSort(lList):
        n=int(len(lList)/2-1)
        while n>=0:
            maxHeapify(lList,n,len(lList))
            n-=1
        n=len(lList)-1
        #输出排序结果 每次输出第一位,并且将第一位与最后一个元素交换,然后重新排序一遍
        while n>=0:
            print(lList[0],end="")
            lList[0]=lList[n]
            maxHeapify(lList,0,n)
            n-=1
        print()
    def main():
        l = [0,1,2,3,4,5,6,7,8,9]
        HeapSort(l)
    
    if __name__ == "__main__":
        main()
  • 相关阅读:
    NOI2005 聪聪和可可
    CodeVS 1344 线型网络
    BZOJ 2466: [中山市选2009]树
    BZOJ 3827: [Poi2014]Around the world
    BZOJ 1109: [POI2007]堆积木Klo
    BZOJ 2124: 等差子序列
    BZOJ 4544: 椭圆上的整点
    BZOJ 2342: [Shoi2011]双倍回文
    BZOJ 2084: [Poi2010]Antisymmetry
    BZOJ 3111: [Zjoi2013]蚂蚁寻路
  • 原文地址:https://www.cnblogs.com/Reyzal/p/5245207.html
Copyright © 2011-2022 走看看