调整算法
向上调整:
对大堆向上调整:
adujust_up
void adjust_up(int* a, int child)
{
int parent = (child - 1) / 2;
while (child > 0)
{
if (a[child] > a[parent])
{
swap(a[child], a[parent]);
child = parent;
parent = (child - 1) / 2;
}
else//默认是大堆
{
break;
}
}
}
向下调整:
有一个前提,那就是左右子树都是小堆。
adjust_down
void adjust_down(int* a, int n,int root)
{
int parent = root;
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1<n&&a[child + 1] > a[child])//在不是满二叉树的情况下,可能出现只有左孩子没有右孩子
{
child++;
}
if (a[parent] < a[child])
{
swap(a[parent], a[child]);
parent = child;
child = parent * 2 + 1;
}
else//已经是小堆的情况下,如果左右孩子中小的那个比父亲大,则跳出循环
{
break;
}
}
}
堆排序
堆排序的核心思想是建堆。
排升序建大堆。
以免树的关系发生混乱。
void heap_sort(int* a, int n)
{
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{
adjust_down(a, n, i);
}
int end = n - 1;
while (end > 0)
{
swap(a[0], a[end]);
adjust_down(a, end, 0);
--end;
}
}