排序之堆排序

堆的特点

堆其实是一种完全二叉树,从上到下从左到右,大顶堆的父节点大于其左右子节点,小顶堆的父节点小于其左右子节点

步骤

(1):首先是进行Heapify,建立堆
(2):从下到上,从右到左的进行heapify构建有序的堆
(3):进行排序,将堆顶父节点和底层最右边的子节点互换,然后不断重复以上步骤
在这里插入图片描述
1:Heapify

def heapify(tree, n, i):
    # n为树的长度, i为起始的父节点
    if (i >= n): # 当i超过树的长度时跳出循环
        return
    c1 = 2*i + 1 # 左儿子
    c2 = 2*i + 2 # 右儿子
    max = i # 当前的父节点
    if (c1 < n and tree[c1] > tree[max]): # 当是>时,大顶堆; 当是<时,小顶堆
        max = c1
    if (c2 < n and tree[c2] > tree[max]):
        max = c2
    if (max != i): # 当max和i不一样的时候才进行调换
        tree[i], tree[max]=tree[max], tree[i]
        heapify(tree, n, max)

2:build_heap

def build_heap(tree):
    n = len(tree)
    last_node = (n - 1)//2 # 最后的一个父节点
    for i in range(last_node, -1, -1): # 从下到上,从右到左
        heapify(tree, n, i)

3:heap_sort

def heap_sort(tree):
    build_heap(tree) # 对于无序的数组先建立好大顶堆
    for i in range(len(tree)-1, -1, -1): # 注意这里是len(tree)-1
        tree[0], tree[i] = tree[i], tree[0]
        heapify(tree, i, 0) # 注意,这里直接就是使用i当成树的长度

参考链接:
视频:av4719699320多分钟,讲解的很细,看完就都会了
堆排序的Python实现(附详细过程图和讲解),这个用链表来代替list

为什么堆排序是不稳定的

比如:3 27 36 27,
如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的27先于第二个位置的27输出,不稳定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值