堆排序python

堆排序(Heapsort)是利用二叉堆的概念来排序:

 

# 堆的向下调整函数(大根堆)
def sift(li, low, high):
"""li:列表,low:堆的根节点位置,high:堆的最后一个元素的位置""" i = low # i 最开始指向根节点 j = 2 * i + 1 # j开始是左孩子 tmp = li[low] # 把堆顶存起来 while j <= high: # 只要j位置有数 if j + 1 <= high and li[j+1] > li[j]: # 如果右孩子有并且比较大 j = j + 1  # j指向右孩子 if li[j] > tmp: # 左孩子比较大 li[i] = li[j] # 把左孩子的值放到父节点 i = j # 往下看一层 j = 2 * i + 1 else: # tmp更大,把tmp放到i的位置上 li[i] = tmp # 把tmp放到某一级位置上 break else: # 把tmp放到叶子节点 li[i] = tmp

 堆排序:

def heap_sort(li):
    n = len(li) # n是列表的长度
    for i in range((n-2)//2, -1, -1):
        # i表示建堆的时候调整部分的根的下标
        sift(li, i, n-1)    # high 始终指向最后一个位置n-1,保证不越界即可
    # 建堆完成
    for i in range(n-1, -1, -1):
        # i 指向当前堆的最后一个元素
        li[0],li[i] = li[i],li[0]   # 交换最后一个元素和第一个元素后,high还是指向最后一个元素的位置
        sift(li, 0, i-1)    # 注意,i要减一,因为新调整的堆不包括最后一个位置了

 

posted @ 2023-06-10 17:35  天才九少  阅读(22)  评论(0)    收藏  举报