目录
大小堆
大堆:最上面的数字是最小的,越往下越大
小堆:最上面的数字是最大的,越往下越小
堆的复杂程度:
由错位相减我们可以知道T(n)= n - log(n-1) = n,所以建堆的复杂程度为O(N)
堆的实现
堆的创建
void HPInit(HP* php)
{
assert(php);
php->a = NULL;
php->size = php->capacity = 0;
}
堆的销毁
void HPDestroy(HP* php)
{
assert(php);
free(php->a);
php->a = NULL;
php->size = php->capacity = 0;
}
交换
void Swap(HPDataType* p1, HPDataType* p2)
{
HPDataType tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
向上调整
void Adjustup(HPDataType* a, int child)
{
int parent = (child - 1) / 2;
while (child > 0)
{
if (a[child] < a[parent])
{
Swap(&a[child], &a[parent]);
child = parent;
int parent = (child - 1) / 2;
}
else
{
break;
}
}
}
向下调整
void AdjustDown(HPDataType* a, int n, int parent)
{
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1 < n && a[child] > a[child + 1])//先假设左孩子是小的
{
child++;
}
if (a[child] < a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
弹出首个元素
void HPPop(HP* php)
{
assert(php);
assert(php->size > 0);
Swap(&php->a[0], &php->a[php->size - 1]);
php->size--;
AdjustDown(php->a, php->size, 0);
}
取出首个元素
HPDataType HPTop(HP* php)
{
assert(php);
assert(php->size);
return php->a[0];
}
判空
bool HPEmpty(HP* php)
{
assert(php);
return php->size == 0;
}
堆插入
void HPPush(HP* php, HPDataType x)
{
assert(php);
if (php->size == php->capacity)
{
int newcapacity = (php->capacity == php->size == 0 ? 4 : php->capacity * 2);
HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));//扩建的是字节
if (tmp == NULL)
{
printf("malloc faild");
return;
}
}
php->a[php->size] = x;
php->size++;
Adjustup(php->a, php->size - 1);
}