小根堆的实现

  1. package util;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. public class Heap {
  5. // 实际大小
  6. private int size;
  7. // 最大容量
  8. private int capacity;
  9. // 数据
  10. int[] data;
  11. /**
  12. * 初始化
  13. */
  14. public Heap() {
  15. size = 0;
  16. capacity = 100;
  17. data = new int[capacity];
  18. }
  19. /**
  20. * 指定初始容量初始化
  21. *
  22. * @param capacity 初始容量
  23. */
  24. public Heap(int capacity) {
  25. size = 0;
  26. this.capacity = capacity;
  27. data = new int[capacity];
  28. }
  29. /**
  30. * 向下堆化
  31. *
  32. * @param i 起始位置
  33. */
  34. private void fixDown(int i) {
  35. int num = data[i];
  36. int son = i * 2 + 1;
  37. while ((son < size)) {
  38. if ((son + 1 < size) && (data[son] > data[son + 1])) {
  39. ++son;
  40. }
  41. if (num < data[son]) {
  42. break;
  43. }
  44. data[i] = data[son];
  45. i = son;
  46. son = i * 2 + 1;
  47. }
  48. data[i] = num;
  49. }
  50. /**
  51. * 向上堆化
  52. *
  53. * @param i 起始位置
  54. */
  55. private void fixUp(int i) {
  56. int num = data[i];
  57. int father = (i - 1) / 2;
  58. while ((i > 0) && (data[father] > num)) {
  59. data[i] = data[father];
  60. i = father;
  61. father = (i - 1) / 2;
  62. }
  63. data[i] = num;
  64. }
  65. /**
  66. * 添加元素
  67. *
  68. * @param item 元素值
  69. */
  70. public void offer(int item) {
  71. // 扩容
  72. if (size == capacity) {
  73. data = Arrays.copyOf(data, data.length * 2);
  74. capacity *= 2;
  75. }
  76. data[size++] = item;
  77. fixUp(size - 1);
  78. }
  79. /**
  80. * 删除堆顶元素
  81. *
  82. * @return 原堆顶元素的值
  83. */
  84. public int poll() {
  85. if (size == 0) {
  86. throw new UnsupportedOperationException("堆为空");
  87. }
  88. int ans = data[0];
  89. data[0] = data[size - 1];
  90. --size;
  91. fixDown(0);
  92. return ans;
  93. }
  94. /**
  95. * 堆是否为空
  96. * @return 堆中无元素则空, 有元素则非空
  97. */
  98. public boolean isEmpty() {
  99. return size == 0;
  100. }
  101. public static void main(String[] args) {
  102. Heap heap = new Heap();
  103. Random random = new Random();
  104. for (int i = 0; i < 500; ++i) {
  105. heap.offer(random.nextInt(1000));
  106. }
  107. while (!heap.isEmpty()) {
  108. System.out.println(heap.poll());
  109. }
  110. }
  111. }