码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2018-12-21 20:19:20      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:一个   nbsp   com   baidu   nlog   pre   它的   操作   n个元素   

# 堆排序
"""

堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。
将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余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

堆排序

标签:一个   nbsp   com   baidu   nlog   pre   它的   操作   n个元素   

原文地址:https://www.cnblogs.com/xuspace/p/10158629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!