AcWing 838. 堆排序python3
原题链接
简单
作者:
xanxus1111
,
2020-05-07 23:50:25
,
所有人可见
,
阅读 583
#一维数组存一个数,左儿子是2x 右儿子2x+1 root 从 1 开始比较方便 要是从0 开始 2x = 0 冲突
# 插入一个数: heap[++size] = x; up(size)
# 求集合当中最小的值: heap[1]
# 删除最小值: heap[1] = heap[size]; size--; down[1]
# 删除任意一个元素 heap[k] = heap[size]; size --; down[k]; up[k]; (只会执行一个)
# 修改任意一个元素 heap[k] = x; down[k]; up[k];
def down(u):
t = u
if u * 2 <= size and h[u * 2] < h[t] : t = u * 2
if u * 2 + 1 <= size and h[u * 2 + 1] < h[t] : t = u * 2 + 1
if u != t:
h[u],h[t] = h[t],h[u]
down(t)
if __name__ == '__main__':
n,m = map(int,input().split())
h = list(map(int,input().split()))
h.insert(0, 0)
size = n
for i in range((n+1)//2,0,-1):
down(i)
for i in range(m):
print(h[1],end = ' ')
h[1] = h[size]
size-=1
down(1)