堆分最小堆,最大堆
最小堆是父亲小于儿子,最大堆相反
堆排序的核心代码是 将数组堆化
下面这个函数是将杂乱的数组调整为一个最小堆,这里没有采用链表,堆排序是对数组排序,逻辑上是树状存储,物理上还是数组
void makeMinHeap(int *p,int num)//把一个数组变成最小堆 num为数组长度
{
int last=0;
if(num%2==0)
{
last=num/2-1;
}
else last=num/2;
for (int i=last;i>=0;--i)
{
//对每个根节点调整
adjustHeap(p,num,i);
}
}
void adjustHeap(int *p,int num,int i)//i为需要调整的节点
{
int lastIndex=num-1;
if(2*i+1<lastIndex) //说明有左右子节点
{
if (p[2*i+1]<=p[i]&&p[2*i+1]<=p[2*i+2])
{
swap(&p[2*i+1],&p[i]);
adjustHeap(p,num,2*i+1);
}
if (p[2*i+2]<=p[i]&&p[2*i+2]<=p[2*i+1])
{
swap(&p[2*i+2],&p[i]);
adjustHeap(p,num,2*i+2);
}
}
else if (2*i+1==lastIndex)
//只有左子节点
{
if (p[i]>p[2*i+1])
{
swap(&p[i],&p[2*i+1]);
}
}
}
堆还有插入与删除:
插入是将在尾巴上插入新节点 插入以后要重新调整堆
删除是删除头节点,用尾巴节点覆盖它
堆排序就是一个不断删除(输出头结点)头结点,用尾巴替代头结点然后调整堆的过程;