const int maxn=100;
int heap[maxn]; //堆
int n=10; //元素个数
1、向下调整
对heap数组在【low,high】范围进行向下调整
其中low为欲调整结点的数组下标,high一般为堆的最后一个元素的数组下标
//对heap数组在【low,high】范围进行向下调整
//其中low为欲调整结点的数组下标,high一般为堆的最后一个元素的数组下标
void downAdjust(int low,int high)
{
int i=low;
int j=i*2; //i为欲调整结点,j为其左孩子
while(j<=high)
{
//如果右孩子存在,且右孩子的值大于左孩子
if(j+1<=high&&heap[j+1]>heap[j])
{
j=j+1;
}
if(heap[j]>heap[i])
{
swap(heap[j],heap[i]);
i=j;
j=i*2;
}
else
{
break;
}
}
}
2、建堆
void createHeap()
{
for(int i=n/2;i>=1;i--)
{
downAdjust(i,n);
}
}
3、删除堆顶元素
void deleteTop()
{
//heap[1]=heap[n--];
heap[1]=heap[n];
n--;
downAdjust(1,n);
}
4、向上调整
void upAdjust(int low,int high)
{
int i=high; //i为欲调整结点
int j=i/2; //j为其父节点
while(j>=low)
{
if(heap[j]<heap[i])
{
swap(heap[j],heap[i]);
i=j; //保持i为欲调整结点,j为i的父节点
j=i/2;
}
else
{
break;
}
}
}
5、插入元素
void insert(int x)
{
heap[++n]=x;
upAdjust(1,n);
}
6、堆排序
void heapSort()
{
createHeap();
for(int i=n;i>1;i--)
{
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}
来源:CSDN
作者:康斯但丁丶
链接:https://blog.csdn.net/OpenStack_/article/details/104066165