优先队列和堆排
优先队列
定义:可以移除最大或最小的元素。
API:插入,删除,是否为空,大小
应用:数值计算,数据压缩,图搜索,人工智能,统计学,操作系统,离散优化,垃圾过滤
初级实现:数组实现(无序),数组实现(有序),链表实现。
二叉堆
数组实现,实际上并没有显式的连接。
堆有序:当一棵二叉树的每个节点都大于等于它的两个子节点时,它被称为堆有序。
根节点是堆有序的二叉树中的最大节点。
二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级存储(不使用数组的第一个位置)
主要API在于:swim(),sink();
具体的swim和sink实现:
1 | private void swim(int k){ |
1 | public void insert(Key x){ |
1 | private void sink(int k){ |
1 | public Key delMax(){ |
Java 实现
堆排序
利用优先队列可以进行排序方法。堆排序分为两个阶段
在堆的构造阶段,我们将原始数组重新组织安排进一个堆中。
下沉阶段,我们从堆中按递减顺序取出所有元素并得到排序结果。
1 | public static void sort(Comparable[] a){ |