网站开发用什么字体一般,外贸网站模板建设,用ps怎么做网站步骤,怎样办一个网站目录 1 概念
2 堆的概念
2.1小根堆
2.2大根堆
3堆的存储方式
4、堆的创建
4.1堆向下调整
5、时间复杂度
6、堆的插入#xff08;向上调整#xff09;
7、堆的删除
8、PriorityQueue的特性
9、堆排序 1 概念 我们知道的队列#xff0c;队列是一…目录 1 概念
2 堆的概念
2.1小根堆
2.2大根堆
3堆的存储方式
4、堆的创建
4.1堆向下调整
5、时间复杂度
6、堆的插入向上调整
7、堆的删除
8、PriorityQueue的特性
9、堆排序 1 概念 我们知道的队列队列是一种先进先出(FIFO)的数据结构但有些情况下操作的数据可能带有优先级一般出队 列时可能需要优先级高的元素先出队列该中场景下使用队列显然不合适比如在手机上玩游戏的时候如果有来电那么系统应该优先处理打进来的电话初中那会班主任排座位时可能会让成绩好的同学先挑座位。 JDK1.8 中的 PriorityQueue 底层使用了堆这种数据结构而堆实际就是在 完全二叉树 的基础上进行了一些调整。 2 堆的概念
2.1小根堆 2.2大根堆 3堆的存储方式 从堆的概念可知 堆是一棵完全二叉树因此可以层序的规则采用顺序的方式来高效存储 4、堆的创建
4.1堆向下调整 对于集合 { 27,15,19,18,28,34,65,49,25,37 } 中的数据如果将其创建成堆呢 向下过程 ( 以小堆为例 ) 1. 让 parent 标记需要调整的节点 child 标记 parent 的左孩子 ( 注意 parent 如果有孩子一定先是有左孩子 ) 2. 如果 parent 的左孩子存在即 :child size 进行以下操作直到 parent 的左孩子不存在 parent 右孩子是否存在存在找到左右孩子中最小的孩子让 child 进行标 将 parent 与较小的孩子 child 比较如果 parent小于较小的孩子 child 调整结束 否则交换parent 与较小的孩子 child 交换完成之后 parent 中大的元素向下移动可能导致子树不满足对的性质因需要继续向下调整即parent child child parent*21; 然后继续步骤 2 。 //创建堆
public void creatHeap(){int preheap;//每次的根节点for ( preheap(usesize-1-1)/2;preheap0;preheap--){signHeap(preheap,usesize);}}//向下调整为大根堆为例private void signHeap(int preheap,int end){//向下调整int childpreheap*21;//preheap左子树下标while (childend){if(child1endelem[child]elem[child1])child;//现在child指向孩子节点的最大值if (elem[preheap]elem[child]){swap(preheap,child);preheapchild;childchild*21;}else break;}}private void swap(int i,int j) {int tmp elem[i];elem[i] elem[j];elem[j] tmp;} 5、时间复杂度 因为堆是完全二叉树而满二叉树也是完全二叉树此处为了简化使用满二叉树来证明 ( 时间复杂度本来看的就是近似值多几个节点不影响最终结果) 6、堆的插入向上调整 堆的插入总共需要两个步骤 1. 先将元素放入到底层空间中(注意空间不够时需要扩容) 2. 将最后新插入的节点向上调整直到满足堆的性质 public void offer(int key){if(isFull()) Arrays.copyOf(elem,elem.length*2);//扩容elem[usesize]key;usesize;//调整为大根堆,向上调整siftUp(usesize-1);}//向上调整private void siftUp(int child) {int parent (child-1)/2;while (child 0) {//或者parent0if(elem[child] elem[parent]) {swap(child,parent);child parent;parent (child-1)/2;}else {break;}}} 7、堆的删除 1. 将堆顶元素对堆中最后一个元素交换 2. 将堆中有效数据个数减少一个 3. 对堆顶元素进行向下调整 public int poll() {int tmp elem[0];swap(0,usesize-1);usesize--;signHeap(0,usesize);//0下标元素和最后一个元素换之后只有0下标还不是大根堆调整return tmp;}
8、PriorityQueue的特性
1. 使用时必须导入PriorityQueue所在的包即import java.util.PriorityQueue; 2. PriorityQueue中放置的元素必须要能够比较大小不能插入无法比较大小的对象否则会抛出 ClassCastException异常放入自定义元素类可以让该类继承Comparable并重写ComparTo方法或者写比较器例
class Imp implements ComparatorInteger{Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);//大根堆}
}
public class Test1 {public int[] smallestK(int[] arr, int k) {//堆的默认比较时小根堆我们建立大根堆需要比较器PriorityQueueInteger pnew PriorityQueueInteger(new Imp()); 3. 不能插入null对象否则会抛出NullPointerException 4. 没有容量限制可以插入任意多个元素其内部可以自动扩容 5. 插入和删除元素的时间复杂度为 6. PriorityQueue底层使用了堆数据结构 7. PriorityQueue默认情况下是小堆---即每次获取到的元素都是最小的元素
9、堆排序
见下一篇博客介绍所有排序