#include <iostream>
using namespace std;
template <class T>
struct Heap {
T* data;
int capacity;
int size;
Heap(int max) {
data = new T[max + 1];
capacity = max + 1;
size = 0;
}
Heap(T* list, int size, int max) {
this->data = new T[max + 1];
this->size = size; //must use this->size
this->capacity = max + 1;
for (int i = 1; i <= size; i ++) {
data[i] = list[i - 1];
// cout << data[i] << endl;
}
for (int i = size / 2; i > 0; i --)
percolateDown(i);
}
void printHeap() {
for (int i = 1; i <= size; i ++) {
cout << data[i] << " ";
}
cout << endl;
}
void percolateUp(int k) {
T x = data[k];
int i;
for (i = k; i > 1 && x < data[i / 2]; i /= 2) //i从k开始,让x与data[i / 2]作比较。i从k / 2开始是错误的,因为k = 3时,3 / 2 = 1;但是1 * 2 != 3
data[i] = data[i / 2];
data[i] = x;
}
void percolateDown(int k) {
T x = data[k];
int child = k, i;
for (i = k; i * 2 <= size; i = child) { //注意是 i * 2 <= size
child = i * 2; //用child保存避免对i进行操作
if (data[child] < size && data[child] > data[child + 1])
child ++;
if (x > data[child]) data[i] = data[child];
else break;
}
data[i] = x;
}
bool isFull() {
return size == capacity;
}
bool isEmpty() {
return size == 0 ? 1 : 0;
}
bool insertHeap(T tdata) {
if (isFull()) return 0;
data[++size] = tdata;
percolateUp(size);
return 1;
}
bool removeHeap(int k) { //移除第K位元素
if (isEmpty() || k > size) return 0;
data[k] = data[size --];
percolateDown(k);
return 1;
}
};
int main() {
// Heap<int> *h = new Heap<int>(100);
// h->insertHeap(100);
// h->insertHeap(-1);
// h->insertHeap(-2);
// h->insertHeap(2);
// h->insertHeap(3);
// h->insertHeap(5);
// h->insertHeap(-1000);
// h->printHeap();
int list[7] = {100, -1, -2, 2, 3, 5, -1000 };
Heap<int> hh(list, 7, 100);
hh.printHeap();
int n;
cin >> n;
return 0;
}
复习数据结构堆
最新推荐文章于 2024-05-11 21:40:14 发布