#include <iostream>
#define N 100
using namespace std;
int parent(int i) {
return i / 2;
}
int left(int i) {
return 2 * i;
}
int right(int i) {
return 2 * i + 1;
}
void maxHeapify(int *p, int i, int heapSize) {
int l, r, temp, largest;
l = left(i);
r = right(i);
if(l < heapSize && p[l] > p[i])
largest = l;
else
largest = i;
if(r < heapSize && p[r] > p[largest])
largest = r;
if(largest != i) {
temp = p[i];
p[i] = p[largest];
p[largest] = temp;
maxHeapify(p, largest, heapSize);
}
}
void buildMaxHeapify(int *p, int heapSize) {
for(int i = heapSize / 2; i >= 0; i--)
maxHeapify(p, i, heapSize);
}
int heapMaximum(int *p) {
return p[0];
}
int heapExtractMax(int *p, int heapSize) {
int max;
if(heapSize < 1)
return 1;
max = p[0];
p[0] = p[heapSize - 1];
heapSize--;
maxHeapify(p, 0, heapSize);
return max;
}
void heapIncreaseKey(int *p, int i, int key) {
if(key < p[i])
return;
p[i] = key;
while(i > 0 && p[parent(i) < p[i]]) {
int temp = p[i];
p[i] = p[parent(i)];
p[parent(i)] = temp;
i = parent(i);
}
}
void maxHeapInsert(int *p, int heapSize, int key) {
heapSize ++;
p[heapSize -1] = -99999999;
heapIncreaseKey(p, heapSize - 1, key);
}
int main() {
freopen("6.5.in", "r", stdin);
int i, n, p[N];
cin>>n;
for(i = 0; i < n; i++)
cin>>p[i];
buildMaxHeapify(p, n);
cout<<heapExtractMax(p, n)<<endl;
return 0;
}
2.最小优先队列
#include <iostream>
#define N 100
using namespace std;
int parent(int i) {
return i / 2;
}
int left(int i) {
return 2 * i;
}
int right(int i) {
return 2 * i + 1;
}
void minHeapify(int *p, int i, int heapSize) {
int l, r, temp, largest;
l = left(i);
r = right(i);
if(l < heapSize && p[l] < p[i])
largest = l;
else
largest = i;
if(r < heapSize && p[r] < p[largest])
largest = r;
if(largest != i) {
temp = p[i];
p[i] = p[largest];
p[largest] = temp;
minHeapify(p, largest, heapSize);
}
}
void buildMinHeapify(int *p, int heapSize) {
for(int i = heapSize / 2; i >= 0; i--)
minHeapify(p, i, heapSize);
}
int heapMinimum(int *p) {
return p[0];
}
int heapExtractMin(int *p, int heapSize) {
int min;
if(heapSize < 1)
return 1;
min = p[0];
p[0] = p[heapSize - 1];
heapSize--;
minHeapify(p, 0, heapSize);
return min;
}
void heapDecreaseKey(int *p, int i, int key) {
if(key > p[i])
return;
p[i] = key;
while(i > 0 && p[parent(i) > p[i]]) {
int temp = p[i];
p[i] = p[parent(i)];
p[parent(i)] = temp;
i = parent(i);
}
}
void minHeapInsert(int *p, int heapSize, int key) {
heapSize ++;
p[heapSize -1] = 99999999;
heapDecreaseKey(p, heapSize - 1, key);
}
int main() {
freopen("6.5.in", "r", stdin);
int i, n, p[N];
cin>>n;
for(i = 0; i < n; i++)
cin>>p[i];
buildMinHeapify(p, n);
cout<<heapExtractMin(p, n)<<endl;
return 0;
}
测试数据