堆排序(以大根堆为例)
向下调整
# 向下调整
def sift(li,low,high):
"""
:param li: 列表
:param low: 堆的根节点位置
:param high: 堆的最后一个元素位置
:return:
"""
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更大
break
li[i] = tmp # 把tmp放到i的位置上
堆排序
def heap_sort(li):
n = len(li) # 列表最后一个元素下标
for i in range((n - 2) // 2,-1,-1):
# i表示建堆的时候调整的部分的根的下标
sift(li,i,n - 1)
# 此时已经建堆完成
# 现在开始排序
for i in range(n - 1,-1,-1):
# i指向当前堆的最后一个元素
li[0],li[i] = li[i],li[0]
sift(li,0,i - 1)
验证
import random
li = [i for i in range(1,11)]
random.shuffle(li)
print(li) # [1, 7, 3, 6, 10, 4, 8, 2, 5, 9]
heap_sort(li)
print(li) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
暑期编程PK赛
得CSDN机械键盘等精美礼品!