我们学过很多排序,其实它们的很多效率其实不是很高,比如像冒泡排序之类的,接下来我们来介绍下什么是堆排序。
如果我们要排升序的话,我们要建大堆,说明如下:
如图这是我们建好的大堆,但我们怎么去拍升序呢,不能重新开辟新的空间,我们是不是可以把80这一节点和最后这一节点换下。
换完后,我们在可以向下调整,把53往下调,把比53大的往上调以此类推
在把75和最后21换,最后排成了一个升序。代码如下
void AdjustUp(HPDtaType* a, int chlid)//向上调整
{
int parent = 0;
parent = (chlid - 1) / 2;
while (chlid)//当chlid为零时,循环停止
{
if (a[parent] < a[chlid])//当孩子结点大于双亲结点时,就进行交换,
{
HPDtaType tmp = a[chlid];
a[chlid] = a[parent];
a[parent] = tmp;
chlid = parent;
parent = (chlid - 1) / 2;
}
else
{
break;
}
}
}
void Adjustdown(HPDtaType* a, int n, int partent)//向下调整
{
int chlid = 0;
chlid = partent * 2 + 1;
while (chlid < n)
{
if (chlid + 1<n&&a[chlid + 1] > a[chlid])
{
chlid++;
}
if (a[chlid] > a[partent])
{
Swap(&a[chlid], &a[partent]);
partent = chlid;
chlid = partent*2+1;
}
else
{
break;
}
}
}
void Swap(HPDtaType*px, HPDtaType*py)//交换接口
{
HPDtaType tmp = *px;
*px = *py;
*py = tmp;
}
以上使我们所要用到的接口函数
#include"HeapSort.h"
int main()
{
int a[] = { 10, 12, 54, 33, 21, 60, 75, 70, 43, 53, 80 };
int sz = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < sz; i++)
{
printf("%d ", a[i]);
}
printf("\n");
for (int i = 1; i < sz; i++)
{
AdjustUp(a, i);//建大堆
}
for (int i = 0; i < sz; i++)
{
printf("%d ", a[i]);
}
printf("\n");
for (int end = sz - 1; end >= 0; end--)
{
Swap(&a[end], &a[0]);
Adjustdown(a, end, 0);
}
for (int i = 0; i < sz; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
这是我们最后的测试函数
这是我们最后的结果,得到了升序