十大排序算法--选择排序:(2)堆排序(python版)

定义

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序可以说是一种利用堆的概念来排序的选择排序。

堆排序步骤

堆可以分为大根堆和小根堆,这里用最大堆的情况来定义操作:
(1) 最大堆调整(max_heap)
(2) 建立最大堆(build_max_heap)
(3) 堆排序(heap_sort)

堆节点位置

在阵列起始位置为0的情况:
(1) 父节点 i 的左子节点在位置(2i+1)
(2) 父节点 i 的右子节点在位置(2
i+2)
(3) 子节点 i 的父节点在位置floor((i-1)/2)

代码

# 调整堆的结构,使其父节点的值大于子节点的值
def max_heap(heap, heapsize, root):
    left = 2*root+1
    right = left + 1
    large = root
    if left < heapsize and heap[large] < heap[left]:
        large = left
    if right < heapsize and heap[large] < heap[right]:
        large = right
    # 若large=right或large=left,则说明,出现比父节点大的子节点,这时对调,使子节点变为父节点
    if large != root:
        heap[large], heap[root] = heap[root], heap[large]
        max_heap(heap, heapsize, large)
# 构造一个堆,对堆中数据重新排序
def build_max_heap(heap):
    length = len(heap)
    # 从后往前调整结构
    for i in range((length-2)//2,-1,-1):
        max_heap(heap, length, i)
# 将根节点取出与最后一位对调,对前面len-1个节点继续进行对调过程
def heap_sort(heap):
    build_max_heap(heap)
    for i in range(len(heap)-1,-1,-1):
        heap[0], heap[i] = heap[i], heap[0]
        max_heap(heap,i,0)
    return heap

heap_sort([30,50,57,77,62,78,94,80,84])

参考文章

参考这篇文章(大神写得很不错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值