堆排序
堆排序的概念
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
堆是一个近似的完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。
那我们需要先了解什么是二叉树以及完全二叉树
二叉树
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点
如图所示为一个二叉树
完全二叉树
一棵深度为k且有2的k次方-1 个结点的二叉树称为满二叉树。
根据二叉树的性质2, 满二叉树每一层的结点个数都达到了最大值, 即满二叉树的第i层上有2的i次方-1 个结点 (i≥1) 。
如果对满二叉树的结点进行编号, 约定编号从根结点起, 自上而下, 自左而右。则深度为k的, 有n个结点的二叉树, 当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时, 称之为完全二叉树。
从满二叉树和完全二叉树的定义可以看出, 满二叉树是完全二叉树的特殊形态, 即如果一棵二叉树是满二叉树, 则它必定是完全二叉树。
节点的左孩子2i
节点的右孩子2i+1
大顶堆和小顶堆
首先 堆排序分为大顶堆和小顶堆
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列。
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
堆排序的平均时间复杂度为O(nLogn);
堆排序演示(大顶堆)
堆排序的代码实现
void Sub_1()
{
int ArrayData[] = {
4,6,8,5,9,200,-1,100,-2,-3