首页 > 代码库 > data struct | heap

data struct | heap

  1 #include <iostream>  2 #include <string.h>  3 using namespace std;  4   5 template <class T>  6 class Heap {  7 public:  8     Heap():n(0), capacity(100) {  9         this->arr = new T[capacity]; 10     } 11  12     ~Heap() { 13         delete[] arr; 14     } 15  16     void insert(T v) { 17         if (n >= capacity) { 18             T* tmp = new T[capacity << 1]; 19             memcpy(tmp, arr, sizeof(T) * capacity); 20             capacity <<= 1; 21         } 22         arr[n++] = v; 23         shiftUp(n - 1); 24     } 25  26     void del(int index) { 27         if (index < 0 || index >= n) return; 28         swap(arr[index], arr[n - 1]); 29         shiftDown(index, --n); 30     } 31  32     void shiftDown(int st, int ed) { 33         T tmp = arr[st]; 34         while (st < ed) { 35             int next = -1; 36             int left = st * 2 + 1; // left child node  37             if (left < ed) next = left; 38             else break; 39             int right = st * 2 + 2; 40             if (right < ed && arr[right] < arr[next]) next = right; 41             if (arr[next] < arr[st]) { 42                 arr[st] = arr[next]; 43                 st = next; 44             } else break; 45         } 46         arr[st] = tmp; 47     } 48  49     void shiftUp(int ed) { 50         T tmp = arr[ed]; 51         while (ed > 0) { 52             int parent = (ed - 1) / 2; 53             if (arr[ed] < arr[parent]) { 54                 arr[ed] = arr[parent]; 55                 ed = parent; 56             } else break; 57         } 58         arr[ed] = tmp; 59     } 60  61     void sort() { 62         for (int j = n - 1; j >= 1; --j) { 63             swap(arr[0], arr[j]); 64             shiftDown(0, j); // here should be j 65         } 66     } 67  68     void print() const { 69         for (int i = 0; i < n; ++i) { 70             cout << arr[i] << " "; 71         } 72         cout << endl; 73     } 74  75     T get(int pos) { 76         return arr[pos]; 77     } 78  79     void update(int pos, int v) { 80         if (pos < 0 || pos >= n) return; 81         if (arr[pos] < v) { 82             arr[pos] = v; 83             shiftDown(pos, n); 84         } else { 85             shiftUp(pos); 86         } 87     } 88     void increase(int pos, int v) { 89         if (pos < 0 || pos >= n) return; 90         arr[pos] = arr[pos] + v; 91         shiftDown(pos, n); 92     } 93  94     void decrease(int pos, int v) { 95         if (pos < 0 || pos >= n) return; 96         arr[pos] = arr[pos] - v; 97         shiftUp(pos); 98     } 99 100     bool empty() const {101         return n <= 0;102     }103 104     void pop() {105         if (empty()) return;106         del(0);107     }108 109     T top() {110         if (empty()) return;111         return arr[0];112     }113 114 private:115     T* arr;116     int n;117     int capacity;118 };119 120 int main()121 {122     int arr[] = {1, 10,2,4,8,7};123     Heap<int> heap;124     for (int i = 0; i < 6; ++i) {125         heap.insert(arr[i]);126     }127     //heap.sort();128     heap.print();129     heap.del(3);130     heap.print();131     heap.increase(1, 10);132     heap.print();133     return 0;134 }