算法导论之堆排序

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

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

排序步骤:

将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()
posted @ 2016-03-05 17:13  reyzal  阅读(281)  评论(0编辑  收藏  举报