标签:数组 class 通过 else heap int 条件 size wap
①维护堆的性质,max_heapify通过让A[i]的值在最大堆中“逐级下降”,从而使得下标i为根节点的子树重新遵循最大堆性质。
void max_heapify(int A[], int i)
{
int left = 2 * i;
int right = 2 * i + 1;
int largest;
bool flag = false;
flag = false;
if (left <= heap_size && A[left] > A[i])
largest = left;
else
largest = i;
if (right <= heap_size && A[right] > A[largest])
largest = right;
if (largest != i)
{
swap(A[i], A[largest]);
flag = true;
}
if(flag)
max_heapify(A, largest);
}
注意:flag是判断是否递归的条件,当不须交换时,证明维护完毕。
②建堆:自底向上方法利用max_heapity把数组转换成最大堆。
void build_max_heap(int A[])
{
int i;
for (i = heap_size / 2; i >= 1; i--)
{
max_heapify(A, i);
}
}
③堆排序算法:数组中最大元素总在根结点A[1]中,每次将A[1]与A[n]互换,再维护A[1~n-1]最大堆的性质。
void heap_sort(int A[])
{
int i;
build_max_heap(A);
for (i = heap_size; i >= 2; i--)
{
swap(A[1], A[i]);
heap_size = heap_size - 1;
max_heapify(A, 1);
}
}
标签:数组 class 通过 else heap int 条件 size wap
原文地址:https://www.cnblogs.com/KIROsola/p/12159084.html