代码
#pragma once
#ifndef _HEAP_H_
#define _HEAP_H_
typedef int DataType;
typedef int(*Compare)(DataType left, DataType right);
typedef struct Heap
{
DataType* _hp;
int _capacity;
int _size;
Compare _com;
}Heap;
void CreateHeap(Heap* pHp, DataType array[], int size, Compare com);
void InitHeap(Heap* pHp, Compare com);
void Insert(Heap* pHp, DataType data);
void Remove(Heap* pHp);
int EmptyHeap(Heap* pHp);
int SizeHeap(Heap* pHp);
void AdjustDown(Heap* pHp, int parent);
void AdjustUp(Heap* pHp, int child);
DataType Top(Heap* pHp);
void CheckCapacity(Heap* pHp);
int Less(DataType left, DataType right);
int Greater(DataType left, DataType right);
#endif
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include"Heap.h"
void CreateHeap(Heap* pHp, DataType array[], int size, Compare com)
{
pHp->_hp = (DataType*)malloc(sizeof(DataType)*(size + 3));
assert(pHp->_hp);
for (int i = 0; i < size; i++)
{
pHp->_hp[i] = array[i];
}
pHp->_capacity = size + 3;
pHp->_size = size;
pHp->_com = com;
for (int i = (size - 2) / 2; i >= 0; i--)
{
AdjustDown(pHp, i);
}
}
void InitHeap(Heap* pHp, Compare com)
{
pHp->_hp = (DataType*)malloc(sizeof(DataType) * 3);
assert(pHp->_hp);
pHp->_capacity = 3;
pHp->_size = 0;
pHp->_com = com;
}
void swap(DataType* data1,DataType* data2)
{
DataType x = *data1;
*data1 = *data2;
*data2 = x;
}
void Insert(Heap* pHp, DataType data)
{
pHp->_size++;
CheckCapacity(pHp);
pHp->_hp[pHp->_size - 1] = data;
AdjustUp(pHp, pHp->_size - 1);
}
void Remove(Heap* pHp)
{
assert(pHp);
swap(&pHp->_hp[0], &pHp->_hp[pHp->_size-1]);
pHp->_size--;
AdjustDown(pHp, 0);
}
int EmptyHeap(Heap* pHp)
{
return 0 == pHp->_size;
}
int SizeHeap(Heap* pHp)
{
return pHp->_size;
}
void AdjustDown(Heap* pHp, int parent)
{
assert(pHp);
int child = parent * 2 + 1;
while (child < pHp->_size)
{
if (child + 1 < pHp->_size && pHp->_com(pHp->_hp[child + 1], pHp->_hp[child]))
{
child += 1;
}
if (pHp->_com(pHp->_hp[child], pHp->_hp[parent]))
{
swap(&pHp->_hp[child], &pHp->_hp[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
return;
}
}
}
void AdjustUp(Heap* pHp, int child)
{
int parent = (child - 1) / 2;
while (child > 0)
{
if (pHp->_com(pHp->_hp[child], pHp->_hp[parent]))
{
swap(&pHp->_hp[child], &pHp->_hp[parent]);
child = parent;
parent = (child - 1) / 2;
}
else return;
}
}
DataType Top(Heap* pHp)
{
assert(pHp);
return pHp->_hp[0];
}
void CheckCapacity(Heap* pHp)
{
if (pHp->_size > pHp->_capacity)
{
DataType* pNew = (DataType*)malloc(sizeof(DataType) * (2 * pHp->_size + 3));
assert(pNew);
pHp->_capacity = 2 * pHp->_size + 3;
memcpy(pNew, pHp->_hp, sizeof(DataType) *( pHp->_size - 1));
free(pHp->_hp);
pHp->_hp = pNew;
}
}
int Less(DataType left, DataType right)
{
return left < right;
}
int Greater(DataType left, DataType right)
{
return left > right;
}