后续会有补充
堆
堆是一种数据结构,总是一棵完全二叉树,是使用数组存储的,是非线性的;并且要求树中所有的父亲都小于等于孩子(小根堆)/树中所有的父亲都大于等于孩子(大根堆)不一定要有序。
在选数时使用堆,效率很高。
堆分为两种,小根堆和大根堆
删除堆顶数据时不能挪动数据,挪动的话关系可能会全部乱掉
堆排序
小根堆:
1.完全二叉树
2.树中所有的父亲都是小于等于孩子
大根堆:
1.完全二叉树
2.树中所有的父亲都是大于等于孩子
注意:不代表从小到大存或从大到小存
小根堆和大根堆的意义
堆排序。时间复杂度为(N*logN)。堆排序本质是一种选择排序,因为它能得出最大或最小到最顶,可以解决TOP-K问题。选出最大/最小的前几个,这时向下调整一次,就可以选出次大的数
那么排升序是建大堆还是小堆呢?
很多人觉得是建小堆,实际上建大堆好一点,
用小堆的话,只能每次建堆选数据,这样的话,整体的时间复杂度为O(N^2),因为每次去掉最小数来建堆,关系可能会乱,只能再建堆选数,这样的效率会很差,没有用到堆的优势。所以升序要建大堆,降序要建小堆。
实现升序,建大堆的具体方法:
把把最大的数和最后一个数交换,然后忽略不看堆的最后一个数,这时,其他关系都没变,左子树依旧是大堆,右子树依旧是大堆,向下调整一次,选出次大的数,把次大的数放到倒数第二个位置,选第一个数所需的时间复杂度为N,但是后面的都是log(N)
整体的时间复杂度为O(N*logN)