优先队列是做什么用的?你可以在一些数据中找到最大值,你可以设置事件的顺序。为什么不直接排序,然后从头开始取呢?假设数据量很大,比如1亿选10个最大的,你排序后可能内存放不下。优先队列只需要10个空格,直接插入到队列尾部即可。基本优先级队列的基础是构造一个完整的数据二叉树结构,并用数组实现。树的特性是父节点大于任何子节点。父节点的位置是k,子节点是2k和2k+1。使用优先级队列时,每次都从根节点取数据,然后重新调整树结构。插入与删除插入时,将数据插入到末尾,然后使用[float]操作使其到合适的位置,实现排序。publicvoidinsert(Keyv){pq[++N]=v;swim(N);}删除的时候,移除被删除的节点,将尾节点改到被删除的位置,然后使用[下沉]操作,使其到合适的位置,实现排序。/***删除。数组的0位置没有存储数据,从1开始*@return*/publicKeydeleteMax(){keykey=pq[1];交换(1,N--);pq[N+1]=空;水槽(1);returnkey;}浮动对应插入操作。新插入的数据放在最后,难免打乱了原来树的顺序。这时候就需要将插入的节点与父节点进行比较。如果节点大于父节点,则交换它们的位置。实现【父节点大于子节点】的特性。然后不断地与上层的父节点进行比较,直到满足特征为止。//根据特征2:当子节点为k时,父节点的位置为k/2privatevoidswim(intk){while(k>1&&less(k/2,k)){exchange(k,k/2);k=k/2;}}下沉对应删除操作。原来删除的位置被最后一个节点代替,也打乱了树的顺序。这时候就需要将该节点与子节点进行比较。首先要有子节点,其次要选择较大的子节点(这样被选中的节点才有资格作为父节点)。说白了,就是节点。最大的是父节点。选择一个合适的子节点作为父节点后,会继续进行下一级比较,直到没有子节点或者有序为止。privatevoidsink(intk){//这个条件是为了保证有叶子节点while(2*k
