1.介绍
建堆在二叉树当中有着非常重要的地位,尤其是在堆的排序当中,其中对于堆的建立过程当中又分成向下对堆进行调节和对堆作向上调节。这两种地位相当,在许多的地方各自又有相当重要的存在。本文重点讲述这两种方式来进行建堆,为后续的堆排序做一个重要的基础。
2.1.向上调节建堆
***向上调节和向下调节是 分两次写的,所以这两种形式里面的一些函数可能会有一些不同哦****
首先我们需要建立一个数组的数据来为后续数据进入堆当中做准备。
int pHead[10] = { 9,6,3,8,5,2,7,4,1,5 };
然后我们就要建立一个和这个数组一样长度的空间,用作后续的堆来进行使用
int* BuiltHeap(void)
{
int* Headp = (int*)malloc(N*sizeof(int));
if (Headp == NULL)
{
printf("fail malloc\n");
exit(-1);
}
return Headp;
}
然后我们就要将这些数据导入到堆当中,并且进行建立向上进行的小堆排序(这里需要注意的就是建立大堆和建立小堆其实原理都是差不多,只需要我们在后续的比较当中是大于号还是小于号,这里我们就以小堆为例),
void ArrComeHeap(int* pHead, int* HeadP)
{
for (int i = 0; i < N; i++)
{
HeadP[i] = pHead[i];
}
//向上进行调节
for (int i = 1; i < N; i++)
{
AdjustUp(HeadP, i);
}
}
下面这是向上调节的具体的实现的过程
void AdjustUp(int* HeadP, int n)
{
int child = n;
int parent = (child - 1) / 2;
while (child)
{
if (HeadP[child] > HeadP[parent])
{
//交换函数(注意要传地址)
swap(&HeadP[child], &HeadP[parent]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}
经过这样的几步之后,我们就可以将以一组没有规律的一组数据就以向上调节的形式转化为小堆的形式给展现出来了。
2.2.向下调节建堆
同样我们需要建立一个数组的数据来为后续数据进入堆当中做准备
int pHead[10] = { 9,6,3,8,5,2,7,4,1,5};
然后我们就要建立一个和这个数组一样长度的空间,用作后续的堆来进行使用
int* BuiltHeap(void)
{
int* Headp = (int*)malloc(10 * sizeof(int));
if (Headp == NULL)
{
printf("fail malloc\n");
exit(-1);
}
return Headp;
}
然后我们就要将这些数据导入到堆当中,并且进行建立向下进行的小堆排序
void ComeHeap(int*pHead, int* Head)
{
for (int i = 0; i < 10; i++)
{
Head[i] = pHead[i];
}
for (int i = (10 - 1 - 1) / 2; i >= 0; i--)
{
AdjustDown(Head, i, 10);
}
}
下面这是向下调节的具体的实现的过程
void AdjustDown(int* Head, int i, int n)
{
int parent = i;
int child = 2 * parent + 1;
while (child < n)
{
if (Head[child + 1] < Head[child] && (child + 1) < n)
{
child = child + 1;
}
if (Head[child] < Head[parent])
{
swap(&Head[child], &Head[parent]);
parent = child;
child = 2 * parent + 1;
}
else
{
break;
}
}
}
这样我们就可以将堆以向下调节小堆的方式给展现出来了。