1、PriorityQueue实现最小堆和最大堆

1.1、PriorityQueue默认实现的是最小堆

  1. import java.util.PriorityQueue;
  2. public class Test1 {
  3. public static void main(String[] args) {
  4. int[] a = {45,36,18,53,72,30,48,93,15,35};
  5. //1,默认实现的是最小堆,元素按照natural ordering排序(自然排序,例如,数字的从小到大)
  6. PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
  7. for(int i=0;i<a.length;i++) {
  8. minHeap.offer(a[i]);
  9. }
  10. while(!minHeap.isEmpty()) {
  11. System.out.print(minHeap.poll()+" ");
  12. }
  13. System.out.println();
  14. //输出(升序):15 18 30 35 36 45 48 53 72 93
  15. }
  16. }

1.2、通过比较器实现最大堆

  1. import java.util.Comparator;
  2. import java.util.PriorityQueue;
  3. public class Test2 {
  4. public static void main(String[] args) {
  5. int[] a = {45,36,18,53,72,30,48,93,15,35};
  6. //2,通过比较器排序,实现最大堆
  7. PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {
  8. @Override
  9. public int compare(Integer o1, Integer o2) {
  10. /**以下是对比较器升序、降序的理解.
  11. *(1) 写成return o1.compareTo(o2) 或者 return o1-o2表示升序
  12. *(2) 写成return o2.compareTo(o1) 或者return o2-o1表示降序
  13. */
  14. return o2.compareTo(o1);
  15. }
  16. }) ;
  17. for(int i=0;i<a.length;i++) {
  18. maxHeap.offer(a[i]);
  19. }
  20. while(!maxHeap.isEmpty()) {
  21. System.out.print(maxHeap.poll()+" ");
  22. }
  23. System.out.println();
  24. //输出(降序):93 72 53 48 45 36 35 30 18 15
  25. }
  26. }

可以使用lamda表达式进行简写优化

  1. import java.util.Comparator;
  2. import java.util.PriorityQueue;
  3. public class Test2 {
  4. public static void main(String[] args) {
  5. int[] a = {45,36,18,53,72,30,48,93,15,35};
  6. //2,通过比较器排序,实现最大堆
  7. PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>((o1,o2)->(o2.compareTo(o))) ;
  8. for(int i=0;i<a.length;i++) {
  9. maxHeap.offer(a[i]);
  10. }
  11. while(!maxHeap.isEmpty()) {
  12. System.out.print(maxHeap.poll()+" ");
  13. }
  14. System.out.println();
  15. //输出(降序):93 72 53 48 45 36 35 30 18 15
  16. }
  17. }