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 }

data struct | heap,布布扣,bubuko.com

时间: 2024-10-11 10:14:46

data struct | heap的相关文章

Data Struct and Data Type

数据结构.数据类型 在看Java的HashMap之前,插播一点重要的数据结构要点. 1. 数据结构(data structure) 数据结构表达的是:用什么样的结构,组织一类数据. 分为逻辑结构和物理结构: 基本的逻辑结构有:集合.线性结构.树形结构.图: 物理结构:顺序存储.链式存储: 2. 数据类型(data type) 数据类型是和数据结构密切相关的,它是:值的集合和定义在这个值集上的一组操作的总称. 例如:c语言中的一种数据类型:整型变量,其值集为某个区间上的整数,定义在这些整数上的操作

Heap Sort (堆排序)

Heap sort is common in written exams. First of all, what is heap? Heap is a kind of data struct that can be seen as a complete binary tree. The object to indicate heap is an array A that have two attributes: length[A] shows the number of elements in

Heap &amp;amp; Priority Queue

Heap & Priority Queue Definition & Description: In computer science/data structures, a priority queue is an abstract data type which is like a regular queue or stack data structure, but where additionally each element has a "priority" as

数据结构--2--stack, heap, queue, tree

//堆栈 stack  一个有0个或多个元素的又穷线性表//长度为MaxSize 的堆栈Stack CreateStack(int MaxSize); //生成空栈表,最大MaxSizeint IsFull(Stack S, int MaxSize); //判断堆栈S是否已满void Push(Stack S, ElementType item); //将元素item压入堆栈int IsEmpty(Stack S); //判断堆栈S 是否为空ElementType Pop(Stack S); /

C51中遇到一个有关data与xdata的问题,已解决

环境: 我在某个C文件定义了一个结构体变量,然后该变量仅仅是在本文件内被一个函数使用,然后又在中断中调用了该函数,目的是改变一个IO口的输出状态,结果运行时怎么也达不到要的效果. struct BE { unsigned int CountFR; //定时器计数值.通过改变计数值改变音频频率 unsigned char PWR_time; //开启时间,单位为10mS unsigned char FREQ_time; //音频供给时间,单位为10mS unsigned char index; /

What is a heap?--reference

A heap is a partially sorted binary tree. Although a heap is not completely in order, it conforms to a sorting principle: every node has a value less (for the sake of simplicity, we will assume that all orderings are from least to greatest) than eith

[POJ3463] Sightseeing(次短路 Heap + Dijkstra)

传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路.dis[x][1]表示起点到x的次短路: tot[x][2]:tot[x][0]表示起点到x的最短路条数.tot[x][1]表示起点到x的次短路的条数: vis[x][2]对应于x和0.1功能为记录该点是否被访问! 那么如何更新最小和次小路呢?显然我们容易想到下面的方法: 1.if(x<最小)更新最小,次小:2.else if(x==最小)更新方法数:3.else if(x<次小

基本数据结构——堆(Heap)的基本概念及其操作

基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组数据,然后进行相关操作,一般的操作进行一次的时间复杂度在 O(1)~O(logn)之间. 可谓是相当的引领时尚潮流啊(我不信学信息学的你看到log和1的时间复杂度不会激动一下下)!. 什么是完全二叉树呢?别急着去百度啊,要百度我帮你百度: 若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1

struct位域

1 总结下 结构体位域的使用 比如  则 struct _COM2 { u8 Len : 1;//低位 u8 EoN : 2; u8 Stop:1; u8 Bps:4;//高位 } union COM { u18 data; struct _COM2 COM2; }; 测试可用: #include "stdio.h" struct _yyy { int qq8:4; int qq7:4; int qq6:4; int qq5:4; int qq4:4; int qq3:4; int q