堆排序

Posted xuspace

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。

# 堆排序
"""

堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。
将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。
如此反复执行,便能得到一个有序序列了

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,
它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。


堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;
或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图

"""


def d_sort(arr):
l = len(arr)
for i in range(int(l / 2 - 1), -1, -1):
adjustHead(arr, i, l)
# 交换堆顶和最后一个元素,并调整堆结构
for j in range(l - 1, 0, -1):
arr[0], arr[j] = arr[j], arr[0] # 将堆顶元素和末尾元素进行交换
adjustHead(arr, 0, j) # 重新对对进行调整
for k in range(0, l):
print(arr[k])


# 构造大顶堆
def adjustHead(a, i, l):
temp = a[i] # 取出当前元素
k = 2 * i + 1 # 从左子节点开始,即2*i+1
while k < l:
if k + 1 < l & a[k] < a[k + 1]: # 若果左子节点小于右子节点,k指向右子节点
k = k + 1
if a[k] > temp: # 如果子节点大于父节点,将子节点赋值给父节点,并将子节点下标记录下来,后面将父节点值赋值给该子节点
a[i] = a[k]
i = k
else:
break
k = 2 * k + 1 # 把该节点当作父节点,继续操作
a[i] = temp # 将父节点值赋值给该子节点


if __name__ == "__main__":
a = [10, 2, 4, 5]
d_sort(a)

 

百度百科:https://baike.baidu.com/item/%E5%A0%86%E6%8E%92%E5%BA%8F/2840151?fr=aladdin



































以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法:堆排序-Java实现

排序算法总结之堆排序

[ 数据结构 -- 手撕排序算法第七篇 ] 堆及其堆排序

重温基础算法内部排序之堆排序法

重温基础算法内部排序之堆排序法

堆(利用堆进行数组排序)-堆排序