一, 引入堆 \ 优先级队列
队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)。
JDK1.8中的PriorityQueue底层使用了堆这种数据结构,而堆实际就是在完全二叉树的基础上进行了一些调整。
堆是一种完全二叉树的数据结构,可以分为大根堆和小根堆。在大根堆中,每个节点的值都大于或等于其子节点的值;在小根堆中,每个节点的值都小于或等于其子节点的值。堆排序就是基于这种结构而产生的一种程序算法。
二, 创建大顶堆的思路
1.堆的实现思路:
(1)将待排序的序列构造成一个大根堆(或小根堆)。
(2)将堆顶元素与堆底元素交换,并将堆的规模缩小1。
(3)对新的堆顶元素进行向下调整操作,使其重新成为大根堆(或小根堆)。
(4)重复步骤2和3,直到堆的规模为1。
2.大顶堆排序的详细步骤:
(1)构建堆:从最后一个非叶子节点开始,对每个节点进行向下调整操作,使其成为大根堆(或小根堆) 。
(2)排序:将堆顶元素与堆底元素交换,并将堆的规模缩小1。对新的堆顶元素进行向下调整操作,使其重新成为大根堆(或小根堆), 重复此过程,直到堆的规模为1。
(3)返回排序后的序列。
3.创建大顶堆的java代码如下(小顶堆即将大于号和小于号互换,这里不再赘述):
public class Heap {
public int[] elem;
public int usedSize;
public Heap()