要求自拟10个逆序的整数,画出堆排序算法将其排成正序,并举例分析算法稳定性
def down(s, node, end): # s是列表,node是父节点,end是列表长度
"""从上面到下面判断是否符合大顶堆,不符合就交换"""
root = node # 父节点
child = 2 * root + 1 # 子节点
while child < end:
if s[child] < s[child + 1] and (child + 1) < end: # 找出较大的子节点
child += 1
if s[child] > s[root]: # 如果子节点大于父节点,交换
s[child], s[root] = s[root], s[child]
root = child
child = child * 2 + 1
def BuildHeap(s, size):
"""从倒数第二排的非叶子节点开始创建大顶堆"""
for i in range(size // 2 - 1, -1, -1):
down(s, i, size)
def HeapSort(s):
size = len(s)
BuildHeap(s, size)
for i in range(size - 1, 0, -1):
s[0], s[i] = s[i], s[0]
down(s, 0, i)
lst = [49, 38, 35, 27, 23, 19, 17, 15, 10]
print(f'排序前:{lst}')
HeapSort(lst)
print(f'排序后:{lst}')