个人随笔
目录
工具类:Java实现最大堆
2020-09-11 22:56:45

有时候我们需要实现堆排序,但是堆的实现比较复杂,这里整合为工具类,以后就直接用啦。

  1. /**
  2. * 最大堆
  3. * @author pc
  4. *
  5. */
  6. public class MaxHead<E extends Comparable<E>> {
  7. //这里使用数组来实现
  8. private ArrayList<E> data;
  9. public MaxHead(int capacity) {
  10. data = new ArrayList<>(capacity);
  11. }
  12. public MaxHead() {
  13. data = new ArrayList<>();
  14. }
  15. //返回堆中元素的个数
  16. public int getSize() {
  17. return data.size();
  18. }
  19. //返回二叉树中索引为index的节点的父节点索引
  20. public int parent(int index) {
  21. if(index == 0) {
  22. throw new IllegalArgumentException("index-0 dosen't have parent");
  23. }
  24. return (index-1)/2;
  25. }
  26. //返回完全二叉树中索引为index的节点的左孩子的索引
  27. private int leftChild(int index) {
  28. return index*2+1;
  29. }
  30. //返回完全二叉树中索引为index的节点的右孩子的索引
  31. private int rightChild(int index) {
  32. return index * 2 + 2;
  33. }
  34. //交换索引为i、j的值
  35. private void swap(int i, int j) {
  36. E t = data.get(i);
  37. data.set(i, data.get(j));
  38. data.set(j, t);
  39. }
  40. //向堆中添加元素
  41. public void add(E e) {
  42. data.add(e);
  43. siftUp(data.size() - 1);
  44. }
  45. private void siftUp(int k) {
  46. //k不能是根节点,并且k的值要比父节点的值大
  47. while (k > 0 && data.get(parent(k)).compareTo(data.get(k)) < 0) {
  48. swap(k, parent(k));
  49. k = parent(k);
  50. }
  51. }
  52. //看堆中最大的元素
  53. public E findMax() {
  54. if (data.size() == 0)
  55. throw new IllegalArgumentException("Can not findMax when heap is empty");
  56. return data.get(0);
  57. }
  58. //取出堆中最大的元素
  59. public E extractMax() {
  60. E ret = findMax();
  61. swap(0, data.size() - 1);
  62. data.remove(data.size() - 1);
  63. siftDown(0);
  64. return ret;
  65. }
  66. private void siftDown(int k) {
  67. //leftChild存在
  68. while (leftChild(k) < data.size()) {
  69. int j = leftChild(k);
  70. //rightChild存在,且值大于leftChild的值
  71. if (j + 1 < data.size() &&
  72. data.get(j).compareTo(data.get(j + 1)) < 0)
  73. j = rightChild(k);
  74. //data[j]是leftChild和rightChild中最大的
  75. if (data.get(k).compareTo(data.get(j)) >= 0)
  76. break;
  77. swap(k, j);
  78. k = j;
  79. }
  80. }
  81. //取出堆中最大的元素,替换为元素e
  82. public E replace(E e){
  83. E ret = findMax();
  84. data.set(0, e);
  85. siftDown(0);
  86. return ret;
  87. }
  88. //heapify操作:将数组转化为堆
  89. public MaxHead(E[] arrs) {
  90. data = new ArrayList<>(Arrays.asList(arrs));
  91. for (int i = parent(data.size() - 1); i >= 0; i--) {
  92. siftDown(i);
  93. }
  94. }
  95. public void print() {
  96. for (E e : data) {
  97. System.out.print(" "+e);
  98. }
  99. }
  100. public static void main(String[] args) {
  101. MaxHead<Integer> head = new MaxHead<Integer>();
  102. head.add(18);
  103. head.add(17);
  104. head.add(19);
  105. head.add(36);
  106. head.add(13);
  107. head.add(22);
  108. head.add(16);
  109. head.add(28);
  110. head.add(30);
  111. head.add(41);
  112. head.add(62);
  113. head.print();
  114. head.extractMax();
  115. System.out.println();
  116. head.print();
  117. }
  118. }
 583

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2