数据结构Python实现-堆排序

完全二叉树定义

若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

完全二叉树即堆的父节点子节点

设当前的为i,那么其父节点为:(i-1)/2 子节点为:2i+1、2i+2

堆的定义

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树

堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足以下关系时,称之为堆。(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2)

堆排序思想

def sift(li,low,high):
    tmp=li[low]
    i=low
    j=2*i+1
    while j<=high:
        if j+1<=high and li[j]<li[j+1]:
            j+=1                #若右孩子比较大,那么把j指向右孩子
        if li[j]>tmp:       #将大的调整到双亲节点位置,以便继续向下调整 
            li[i]=li[j]
            i=j
            j=2*i+1
        else:
            break
    li[i]=tmp                   #将调整节点的值放入最后的位置


def heap_sort(li):
    n=len(li)
    for low in range(n//2-1,-1,-1):     #建立初始堆,堆是有要求的,父节点大于子节点
        sift(li,low,n-1)
    for high in range(n-1,0,-1):       #完成堆排序
        li[0],li[high]=li[high],li[0]
        sift(li,0,high-1)
        
li=[0,1,7,-1,2]
print(li)
heap_sort(li)
print(li)

代码解释

先建堆,建完堆之后,要进行堆排序,每次把最后一个和第一个交换,然后最后一个取出就是最大值。然后把剩下的再进行建堆,得到最大值。

发布了40 篇原创文章 · 获赞 1 · 访问量 2038

猜你喜欢

转载自blog.csdn.net/qq_40660825/article/details/102514710
今日推荐