堆排序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要减一,因为新调整的堆不包括最后一个位置了

浙公网安备 33010602011771号