堆排序C++实现
堆的数据结构实际就是完全二叉树,即叶子节点只可能出现在最下面两层,且最后一层的叶子节点,从左往右进行排列;
堆的简单性质
由上面所说的堆的结构,可以推出一些简单的堆的性质,这些性质在实现的时候,会用到(将堆存放在数组中):
- 父节点的下标为i,左子节点的下标为2*i+1;
- 父节点的下标为i,右子节点的下标为2*i+2;
堆排序的实现步骤
- 构建最大堆,从最后一个非叶节点n/2-1的位置开始检查节点与其孩子值是否满足最大堆的要求,不满足则需要调整该元素与其孩子节点元素的位置。如果有调整,则调整过的孩子节点(子树)也要递归调用调整子树中的元素值位置,保证子树也是最大堆。然后按照层次遍历的顺序依次往前,从右到左,从下到上调整所有非叶节点的值,最后根节点的值就是最大值。
- 将构建的最大堆中的首元素与末位元素进行位置交换,将数组长度减1,对数组首元素进行一次构建步骤;
- 获取到的数组元素,即是从小到大进行排列;
堆排序的C++代码
void maxHeap(int array[], int i, int n) {