这篇例子中有几处BUG,无法插入新值,因为数组已经定义好了大小,解决方法:可以选择STL的容器来,也可以选择在已有的内存上使用动态分配。
#include <iostream>
using namespace std;
#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));}
int length = 0;
void max_heapify(int A[], int i)
{
int largest;
int l = 2 * (i + 1) - 1;
int r = 2 * (i + 1);
if (l <= length && A[l] > A[i])
largest = l;
else
largest = i;
if (r <= length && A[r] > A[largest])
largest = r;
if (largest != i)
{
swap(A[i], A[largest]);
max_heapify(A, largest);
}
}
int getParent(int i)
{
if(i % 2 == 0)
return (i / 2 - 1);
else
return ((i + 1) / 2 - 1);
}
// 返回堆的最大值
int heap_maximum(int A[])
{
return A[0];
}
// 取出最大值并去除
int heap_extract_max(int A[])
{
if (length < 1)
{
cerr << "error!" << endl;
exit(0);
}
int max = A[0];
A[0] = A[length - 1];
--length;
max_heapify(A, 0);
return max;
}
// 调高第i个值的优先级到key值
void heap_increase_key(int A[], int i, int key)
{
if (key < A[i])
{
cerr << "error!" << endl;
exit(0);
}
A[i] = key;
int parent_i = getParent(i);
while (i > 0 && A[getParent(i)] < A[i])
{
swap(A[i], A[getParent(i)]);
i = getParent(i);
}
}
// 在优先级队列中插入值
void max_heap_insert(int A[], int key)
{
++length;
A[length - 1] = -0xFFFF;
heap_increase_key(A, length - 1, key);
}
int main()
{
int A[] = {16, 14, 10, 8, 7, 9, 3, 2, 4, 1};
GET_ARRAY_LEN(A, length);
heap_increase_key(A, 8, 15);
heap_extract_max(A);
//max_heap_insert(A, 100);
for (int i = 0; i < length; ++i)
{
cout << A[i] << " ";
}
cout << endl;
return 0;
}