堆排序

堆排序其实就是二叉堆的应用
参考
https://blog.csdn.net/u010452388/article/details/81283998
堆排序的时间复杂度O(NlogN)O(N*logN),额外空间复杂度O(1)O(1),是一个不稳定性的排序
堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆

大根堆

每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆


小根堆

每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆

查找数组中某个数的父结点和左右孩子结点,比如已知索引为i的数,那么

1.父结点索引:(i1)/2(i-1)/2

2.左孩子索引:2i+12*i+1

3.右孩子索引:2i+22*i+2

堆排序基本步骤

创建最大堆最大堆调整

将无序数组构造成一个大根堆(升序用大根堆,降序就用小根堆)

每次新插入的数据都与其父结点进行比较,如果插入的数比父结点大,则与父结点交换,否则一直向上交换,直到小于等于父结点,或者来到了顶端

此时,我们已经得到一个大根堆,下面将顶端的数与最后一位数交换,然后将剩余的数再构造成一个大根堆


自己尝试

自己随便写了个数组试了试,还行


c++代码实现