标签:数组 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