要求自拟10个逆序的整数,画出堆排序算法将其排成正序,并举例分析算法稳定性

要求自拟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}')