题意:
本题要求完成堆的初始化、插入、堆头元素的获取、堆的弹出和堆内容的打印。
本题的堆是小顶堆,也就是每次弹出的都是最小的那个元素。同时0号位是一个值为-1的守卫,0号位不使用,所有元素从1号位开始放置。
思路:
①创建堆。包括其数值、当前容量和最大容量。
②堆的插入。若插入值比最后一个节点的下一个节点i的父节点i/2的值小,则将父节点值赋给i(第一次这个i的节点是空的,第二次这个节点已经赋值给其儿子节点),i/=2。循环至插入值比i/2的值大,则将插入值赋给i。
③堆的弹出。因为堆的数值类型定义为int*,所以直接返回数组下标为1的值即可。
源码:
//struct HEAP{
// int* data;
// int reserved_size;
// int cur_size;
// HEAP(int size);
// void push( int value );
// int top() const;
// void pop();
// void show_content() const;
//};
HEAP::HEAP(int size) {
reserved_size = size;
data = new int[size];
cur_size = 0;
data[0] = -1;
}
void HEAP::push(int value) {
int i = 0;
i = ++cur_size;
for (; data[i / 2] > value; i /= 2)
data[i] = data[i / 2];
data[i] = value;
}
int HEAP::top() const {
return data[1];
}
void HEAP::pop() {
int parent = 0, child = 0, t = 0;
t = data[cur_size--];
for (parent = 1; parent * 2 <= cur_size; parent = child) {
child = parent * 2;
if ((child != cur_size) && data[child] > data[child + 1])
child++;
if (t <= data[child])break;
else
data[parent] = data[child];
}
data[parent] = t;
}
void HEAP::show_content() const {
for (int i = 0; i <= cur_size; i++)
cout << data[i] << " ";
cout << endl;
}
ps:无