#include <cmath>
#include <iostream>
using namespace std;
#define MAXSIZE 1000 //堆中最多元素数目
//定义堆得结构
struct element {
int key;
};
element heap[MAXSIZE];
//判断节点所在层,最小层返回true
bool level(int i)
{
double k = log((double)i)/log(2.0);
if((int)k%2 ==0){
return true;
}
else{
return false;
}
}
//在最大层调整,将item插入合适位置---(insert的子函数)
void max_verify(element heap[], int n, element item)
{
int i = n;
int parent = n/4;
while(parent) {
if(heap[parent].key < item.key) {
heap[i] = heap[parent];
i = parent;
parent = parent/4;
}
else
break;
}
heap[i] = item;
}
//最小层调整,将item插入合适位置---(insert的子函数)
void min_verify(element heap[], int n, element item)
{
int i = n;
int parent = n/4;
while(parent) {
if(heap[parent].key > item.key) {
heap[i] = heap[parent];
i = parent;
parent = parent/4;
}
else
break;
}
heap[i] = item;
}
//插入一个元素
void insert(element heap[], int *n, element item)
{
(*n)++;
//若达到堆的最大容量,直接退出
if(*n == MAXSIZE) {
cout<< "heap is full." << endl;
exit(1);
}
//若原堆为空,则直接加入
if(*n == 1) {
heap[*n].key = item.key;
return;
}
//普通情况的插入
int parent = *n/2;
switch(level(parent)) {
case true:
if(heap[parent].key > item.key) {
heap[*n] = heap[parent];
min_verify(heap, parent, item);
} else {
max_verify(heap, *n, item);
}
break;
case false:
if(heap[parent].key < item.key) {
heap[*n] = heap[parent];
max_verify(heap, parent, item);
} else {
min_verify(heap, *n,item);
}
break;
}
}
//寻找子节点和后序节点中最小的节点---(del_min的子函数)
int min_grand_child(element heap[], int n, int i)
{
int min = 2*i;
int k[5] = {2*i+1, 4*i, 4*i+1, 4*i+2, 4*i+3};
for(int j=0; k[j]<=n&&j<=4; ++j) {
if(heap[k[j]].key < heap[min].key)
min = k[j];
}
return min;
}
//删除最小元素,返回最小节点
element del_min(element heap[], int *n)
{
//没有元素时,直接退出
if(*n < 1) {
cout << "heap is empty." << endl;
exit(1);
}
//只有一个元素,直接删除
if(*n == 1){
return heap[(*n)--];
}
//一般情况的删除最小元
element item = heap[(*n)--];
heap[0].key = heap[1].key;
int k, i, last = (*n)/2, parent;
for(i=1; i<=last; ) {
k = min_grand_child(heap, *n, i);
if(item.key <= heap[k].key){
break;
}
heap[i] = heap[k];
if(k <= 2*i+1) {
i = k;
break;
}
parent = k/2;
if(item.key > heap[parent].key) {
element temp = item;
item = heap[parent];
heap[parent] = temp;
}
i = k;
}
heap[i] = item;
return heap[0];
}
//寻找子节点和后序节点中最大的节点---(del_max的子函数)
int max_grand_child(element heap[], int n, int i)
{
int max = 2*i;
int k[5] = {2*i+1, 4*i, 4*i+1, 4*i+2, 4*i+3};
for(int j=0; k[j]<=n&&j<=4; ++j) {
if(heap[k[j]].key > heap[max].key)
max = k[j];
}
return max;
}
//删除最大元素
element del_max(element heap[], int *n)
{
//没有元素时,直接退出
if(*n < 1) {
cout << "heap is empty." << endl;
exit(1);
}
//只有一个元素,直接删除
if(*n == 1){
return heap[(*n)--];
}
//一般情况的删除最大元
element item = heap[(*n)--];
int minpos = max_grand_child(heap, *n, 1);
heap[0].key = heap[minpos].key;
int k, i, last = (*n)/2, parent;
for(i= minpos; i<=last; ) {
k = max_grand_child(heap, *n, i);
if(item.key >= heap[k].key){
break;
}
heap[i] = heap[k];
if(k <= 2*i+1) {
i = k;
break;
}
parent = k/2;
if(item.key < heap[parent].key) {
element temp = item;
item = heap[parent];
heap[parent] = temp;
}
i = k;
}
heap[i] = item;
return heap[0];
}
//驱动程序
int main()
{
int n = 0,i,size;
//构造初始堆
cout << "Input the capacity of the heap(no more than 1000): ";
cin >> size;
for( i=1; i<=size; ++i) {
element item;
item.key = i;
insert(heap, &n, item);
}
for( i=1; i<=n; ++i)
cout<< heap[i].key << " ";
cout << endl;
element e = del_max(heap, &n);
for(i=1; i<=n; ++i)
cout << heap[i].key << " ";
cout << "\tthe maxium element is: " << e.key << endl;
e = del_min(heap, &n);
for(i=1; i<=n; ++i)
cout << heap[i].key << " ";
cout << "\tthe minimum element is: " << e.key << endl;
return 0;
}