数据结构-堆 Java实现
数据结构-堆 Java实现。 实现堆自动增长
1 /** 2 * 数据结构-堆。 自动增长 3 * 4 * @author caiyao 5 */ 6 public class Heap<T extends Comparable> { 7 8 private Object[] node; 9 10 private static final int DEFAULT_SIZE = 10; 11 12 private int size = 0; 13 14 private int capacity; 15 16 private Type type; 17 18 public Heap(Type type){ 19 this(type,DEFAULT_SIZE); 20 } 21 22 public Heap(Type type, int initCapacity){ 23 node = new Object[initCapacity]; 24 this.capacity = initCapacity; 25 this.type = type; 26 } 27 28 /** 29 * 插入 30 * @param newNode 31 */ 32 public void insert(T newNode){ 33 ensureCapacity(size + 2); // 新节点和空着的0号节点 34 node[size + 1] = newNode; 35 upAdjust(); 36 size ++; 37 } 38 private void upAdjust(){ 39 for( 40 int currentNodeIndex = size + 1; 41 ( 42 currentNodeIndex > 1 && ((T)node[currentNodeIndex]).compareTo(node[currentNodeIndex / 2]) < 0 && type == Type.MIN 43 ) || 44 ( 45 currentNodeIndex > 1 && ((T)node[currentNodeIndex]).compareTo(node[currentNodeIndex / 2]) > 0 && type == Type.MAX 46 ); 47 currentNodeIndex = currentNodeIndex / 2 48 ){ 49 Object tempValue = node[currentNodeIndex]; 50 node[currentNodeIndex] = node[currentNodeIndex / 2]; 51 node[currentNodeIndex / 2] = tempValue; 52 } 53 } 54 private void ensureCapacity(int newSize){ 55 if(newSize > DEFAULT_SIZE && newSize > this.capacity){ 56 grow(); 57 } 58 } 59 private void grow(){ 60 int newSize = capacity + (capacity >> 1); // 扩大50%容量 61 node = Arrays.copyOf(node,newSize); 62 } 63 /** 64 * 返回堆顶 65 * @return 66 */ 67 public T top(){ 68 return (T)node[0]; 69 } 70 71 /** 72 * 返回堆顶并从堆中移除 73 * @return 74 */ 75 public T pop(){ 76 T top = (T)node[0]; 77 downAdjust(); 78 node[size] = null; 79 return top; 80 } 81 private void downAdjust(){ 82 node[0] = node[size - 1]; 83 for( 84 int currentNode = 1; 85 ; 86 ){ 87 // 小根堆 + 左子树 88 if(type == Type.MIN && currentNode * 2 <= size && ((T)node[currentNode * 2]).compareTo(node[currentNode]) < 0){ 89 Object tempValue = node[currentNode]; 90 node[currentNode] = node[currentNode * 2]; 91 node[currentNode * 2] = tempValue; 92 currentNode = currentNode * 2; 93 } 94 // 小根堆 + 右子树 95 else if(type == Type.MIN && currentNode * 2 + 1 <= size && ((T)node[currentNode * 2 + 1]).compareTo(node[currentNode]) < 0){ 96 Object tempValue = node[currentNode]; 97 node[currentNode] = node[currentNode * 2 + 1]; 98 node[currentNode * 2 + 1] = tempValue; 99 currentNode = currentNode * 2 + 1; 100 } 101 // 大根堆 + 左子树 102 else if(type == Type.MAX && currentNode * 2 <= size && ((T)node[currentNode * 2]).compareTo(node[currentNode]) > 0){ 103 Object tempValue = node[currentNode]; 104 node[currentNode] = node[currentNode * 2]; 105 node[currentNode * 2] = tempValue; 106 currentNode = currentNode * 2; 107 } 108 // 大根堆 + 右子树 109 else if(type == Type.MAX && currentNode * 2 + 1 <= size && ((T)node[currentNode * 2 + 1]).compareTo(node[currentNode]) > 0){ 110 Object tempValue = node[currentNode]; 111 node[currentNode] = node[currentNode * 2 + 1]; 112 node[currentNode * 2 + 1] = tempValue; 113 currentNode = currentNode * 2 + 1; 114 } 115 else{ 116 break; 117 } 118 } 119 } 120 /** 121 * 遍历 122 */ 123 public void traverse(){ 124 for(int i = 1; i <= size; i ++){ 125 System.out.println(node[i]); 126 } 127 } 128 public enum Type { 129 MIN, 130 MAX 131 } 132 133 public static void main(String[] args){ 134 Heap demo = new Heap<Integer>(Type.MIN); 135 demo.insert(1); 136 demo.insert(10); 137 demo.insert(8); 138 demo.insert(18); 139 demo.insert(2); 140 demo.insert(6); 141 demo.insert(9); 142 demo.insert(0); 143 demo.insert(0); 144 demo.insert(0); 145 demo.insert(0); 146 demo.insert(0); 147 demo.traverse(); 148 } 149 }