zoukankan      html  css  js  c++  java
  • data structure | 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 }
  • 相关阅读:
    CSS布局之盒子模型[二]
    CSS布局之盒子模型[一]
    CSS文本相关之垂直排列[5]
    网站迁移之后,中文路径都变成乱码
    Linux中shell搜索多文件中的字符串
    mysql数据库报错
    使用Flarum轻松搭建自己的论坛
    CSS雪碧图-html优化
    CSS-定位模式
    ul当做div标签的使用
  • 原文地址:https://www.cnblogs.com/linyx/p/3918595.html
Copyright © 2011-2022 走看看