数据结构总结5:堆

后续会有补充 

 堆是一种数据结构,总是一棵完全二叉树,是使用数组存储的,是非线性的;并且要求树中所有的父亲都小于等于孩子(小根堆)/树中所有的父亲都大于等于孩子(大根堆)不一定要有序。

在选数时使用堆,效率很高。

堆分为两种,小根堆和大根堆

删除堆顶数据时不能挪动数据,挪动的话关系可能会全部乱掉

堆排序

小根堆:

        1.完全二叉树

        2.树中所有的父亲都是小于等于孩子

大根堆:

        1.完全二叉树

        2.树中所有的父亲都是大于等于孩子

注意:不代表从小到大存或从大到小存

小根堆和大根堆的意义

        堆排序。时间复杂度为(N*logN)。堆排序本质是一种选择排序,因为它能得出最大或最小到最顶,可以解决TOP-K问题。选出最大/最小的前几个,这时向下调整一次,就可以选出次大的数

那么排升序是建大堆还是小堆呢?

很多人觉得是建小堆,实际上建大堆好一点,

用小堆的话,只能每次建堆选数据,这样的话,整体的时间复杂度为O(N^2),因为每次去掉最小数来建堆,关系可能会乱,只能再建堆选数,这样的效率会很差,没有用到堆的优势。所以升序要建大堆,降序要建小堆。

 

实现升序,建大堆的具体方法:

把把最大的数和最后一个数交换,然后忽略不看堆的最后一个数,这时,其他关系都没变,左子树依旧是大堆,右子树依旧是大堆,向下调整一次,选出次大的数,把次大的数放到倒数第二个位置,选第一个数所需的时间复杂度为N,但是后面的都是log(N)

 

 整体的时间复杂度为O(N*logN)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

列宁格勒的街头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值