欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 堆的相关知识点

堆的相关知识点

2024/11/30 8:39:50 来源:https://blog.csdn.net/gyj215500/article/details/140617489  浏览:    关键词:堆的相关知识点

目录

大小堆

堆的实现

堆的创建

堆的销毁

交换

向上调整

向下调整

弹出首个元素

取出首个元素

判空

堆插入


大小堆

大堆:最上面的数字是最小的,越往下越大

小堆:最上面的数字是最大的,越往下越小

堆的复杂程度:

由错位相减我们可以知道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);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com