我终于把堆排序写出来了!!!
有个总结:当你觉得一个东西很难的时候,胡乱的看博客可能是极其浪费时间的,你就是打开一篇博客,然后another;如果可以的话可以找个视频看看,然后看看对应的书,沉下心慢慢看,慢慢思考,逐渐脱离书本写程序。
涉及知识点:
- 堆排序首先要建立堆
- 大顶堆(父节点>=左右子节点),小顶堆(父节点<=左右子节点)
- 在列表中实现二叉树,若父节点为alist[i],其左右子节点肯定是alist[2*i+1],alist[2*i+2]
- 建堆的过程是找到最后一个父节点,向左一个个建堆,所以有for i in range(end // 2, -1, -1)
- 堆排序(假设是小堆,排序后为递减):每次把堆顶的节点取出,放到堆底,然后把堆底的数放到堆顶,向下筛选,构建了一个新的堆(新堆的长度每次都减一)
alist=[1,3,12,34,12,1,3,2,4]
'''小顶堆,排序后是降序'''
def siftdown(alist, e, begin, end):
i, j = begin, begin * 2 + 1
while