堆排序是指使用堆结构对一个序列进行排序,此处讨论递增排序的情况。
考虑对一个堆来说,堆顶元素是最大的,因此在建堆完毕后,堆排序的直观思路就是取出堆顶元素,然后将堆的最后一个元素替换至堆顶,再进行一次针对堆顶元素的向下调整,如此重复,直到堆中只有一个元素为止。’
具体实现时,为了节省空间,可以倒着遍历数组,假设当前访问到i号位,那么将堆顶元素欲i号位的元素交换,接着在[1,i-1]范围内对堆顶元素进行一次向下调整即可。
堆排序的代码如下:
void heapSort(){
createHeap();//建堆
for(int i=n;i>1;i--){
//倒着枚举,直到堆中只有一个元素
swap(heap[i],heap[1]);//交换heap[i]与堆顶
downAdjust(1,i-1);///调整堆顶
}
}