void BuildMaxHeap(int a[], int len)
{
for(int i = len/2; i > 0 ; i--)
{
AdjustDown(a, i, len);
}
}
// 向下调整
void AdjustDown(int a[], int k, int len)
{
a[0] = a[k];
for(int i = k *2; i <= len; i*=2)
{
if(i < len && a[i] < a[i+1])
i++; //取key较大的子节点的下标
if(a[0] >= a[i]) break;
else
{
a[0] = a[i];
k = i;
}
}
a[k] = a[0];
}
// 向上调整
void AdjustUp(int a[], int k, int len)
{
a[0] = a[k];
int i = k/2;
while(i > 0 && a[i] < a[0])
{
a[k] = a[i];
k = i;
i = k/2;
}
a[k] = a[0];
}
// 堆排序
void HeapSort(int a[], int len)
{
BuildMaxHeap(a,len);
for(int i = len; i>0; i--)
{
swap(a[i], a[1]);
AdjustDown(a,1, i-1);
}
}
转载请注明原文地址: https://ju.6miu.com/read-2387.html