堆排序(Heap Sort)
堆排序 由二叉堆的定义可知,堆顶元素(即二叉堆的根节点)一定为堆中的最大值或最小值,因此如果我们输出堆顶元素后,将剩余的元素再调整为二叉堆,继而再次输出堆顶元素,再将剩余的元素调整为二叉堆,反复执行该过程,这样便可输出一个有序序列,这个过程我们就叫做堆排序。
'''
Creat by HuangDandan
2018-08-15
dandanhuang@sjtu.edu.cn
思想:
每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列
步骤:
堆排序步骤:
1-将数据构建成堆,这里的堆指完全二叉树(不一定是满二叉树)
2-将堆调整为最小堆或最大堆
3-此时堆顶已经为最大数或最小数,可以对下面的分支堆再进行调堆即可,此处采用的是将堆顶数取出,再调堆
难点:
1-如何将一个无序序列建成一个二叉堆
2-在把堆顶元素和栈尾元素交换后,如何将剩余的元素调整为一个二叉堆
'''
'''
def HeapAdjustDown(Lst, start, end):
temp = Lst[start] # temp保存当前结点
child = 2*start + 1 # 2*start+1为序号为start的结点的左子结点编号
while child <= end:
#找到推中的叶子节点 左右节点中最大的那个
if child+1 <= end and Lst[child+1] > Lst[child]:
child += 1
#当前的结点复合最大堆的定义,则不用调整位置,跳出循环
if Lst[child] <= temp:
break
Lst[start], Lst[child] = Lst[child], Lst[start]
start = child
def HeapSort(Lst):
#将数组建立成最大的堆
#第一个非叶子结点的位置 lem(lst)//2-1
for child in range(len(Lst)//2-1, -1, -1):
HeapAdjustDown(Lst, child, len(Lst)-1)
for child in range(len(Lst)-1,0,-1):
Lst[0],Lst[child] = Lst[child], Lst[0]
#将Lst[0,…,i-1]重新调整为最大堆
HeapAdjustDown(Lst,0,child-1)
if __name__ == "__main__":
Lst1 = [1,4,5,2,55,44,66,77,66,66,88,1]
print(Lst1)
HeapSort(Lst1)
print(Lst1)
print("----------------------------------------")
参考博客:
https://blog.csdn.net/ns_code/article/details/20227303 C++进行堆排序编程
https://segmentfault.com/a/1190000006546190?_ea=1082148 具体的python程序
https://www.cnblogs.com/chengxiao/p/6129630.html 具体的python程序
https://www.jb51.net/article/123676.htm