一.背景
堆定义:堆是一种完全二叉树(叶子节点依次序排列,除去叶子节点为一个满树 ),其根节点为二叉树的最大值(大顶堆),或最小值(小顶堆)。CPP标准库中优先级队列,std::priority_queue就是采用堆实现,作为一种容器适配器其底层默认实现为std::deque,可以指定优先队列为大顶堆或小顶堆,依靠第三个模板参数。
堆之所以能够实现最大元素或最小元素置顶是因为一种特殊的堆化操作。
堆排序:堆排序利用堆的根节点为整个二叉树的最大值或者最小值的特性,循环堆化待排序序列,寻找每一次堆化后的最大值或者最小值与末尾元素进行交换从而达到排序的目的。(其实是一种寻找最大值最小值的方法,排序思想类似于选择排序)。时间复杂度为O(nlogn),空间复杂度根据具体实现如果采用非递归实现则为O(1),采用递归则跟递归栈深度有关。堆排序是一种不稳定的排序,会改变相同元素的相对位置,因为在堆化过程中可能会交换元素位置。
二.堆排序实现
#include <iostream>
#include <vector>
void Heapify(std::vector<int> &vec, int length, int index){
// 定义index的左右子节点,左孩子为index乘以2加1,右孩子直接加1