日升时奋斗,日落时自省
目录
一、回顾
习题一:
1.下列关键字序列为堆的是:(A)
A: 100,60,70,50,32,65 B: 60,70,65,50,32,100 C: 65,100,70,32,50,60
D: 70,65,100,32,50,60 E: 32,50,100,70,65,60 F: 50,100,70,65,60,32
解题:堆分为大根堆和小根堆
这里就不解释那么多的图,上一个博客已经解释什么是大根堆
其余的可以自己尝试画图,是否满足;
习题二:
2.已知小根堆为8,15,10,21,34,16,12,删除关键字8之后需重建堆,在此过程中,关键字之间的比较次数是(C)
A: 1 B: 2 C: 3 D: 4
习题三:
3.一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为(D)
A: (11 5 7 2 3 17) B: (11 5 7 2 17 3) C: (17 11 7 2 3 5)
D: (17 11 7 5 3 2) E: (17 7 11 3 5 2) F: (17 7 11 3 2 5)
习题四:
4.最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是(C)
A: [3,2,5,7,4,6,8] B: [2,3,5,7,4,6,8]
C: [2,3,4,5,7,8,6] D: [2,3,4,5,6,7,8]
二、接口使用
2.1PriorityQueue的特性
java集合框架中PriorityQueue和PriorityBlockingQueue两种类型的优先级队列。
PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的
2.2接口涉及的引用类
优先级队列的底层是一个小根堆
class Student implements Comparable<Student>{
public int age;
public Student(int age){
this.age=age;
}
@Override
public int compareTo(Student o) {
return this.age-o.age;
}
}
如何将这个代码改为一个大根堆,其实很简单,这里的comparaTo方法中改为o.age-this.age
代码解释:
2.3接口涉及的包装类
包装类不是引用类,比较的话就需要实现比较器,其实刚刚看到的地方有一个if语句没有执行,它就是这里的关键(图解)
我们知道这里是小根堆,那想改成大根堆就需要改原码,改原码我们是做不到的,但是我们可以写一个比较器
变成大根堆与前面的相似 比较器方法改为 o2-o1