堆排序
Posted kirosola
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。
①维护堆的性质,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); } }
以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章