堆排序
堆排序其实就是二叉堆的应用
参考
https://blog.csdn.net/u010452388/article/details/81283998
堆排序的时间复杂度,额外空间复杂度,是一个不稳定性的排序
堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆
大根堆
每个结点的值都大于其左孩子和右孩子结点的值,称之为大根堆
小根堆
每个结点的值都小于其左孩子和右孩子结点的值,称之为小根堆。
查找数组中某个数的父结点和左右孩子结点,比如已知索引为i的数,那么
1.父结点索引:
2.左孩子索引:
3.右孩子索引:
堆排序基本步骤
将无序数组构造成一个大根堆(升序用大根堆,降序就用小根堆)
每次新插入的数据都与其父结点进行比较,如果插入的数比父结点大,则与父结点交换,否则一直向上交换,直到小于等于父结点,或者来到了顶端
此时,我们已经得到一个大根堆,下面将顶端的数与最后一位数交换,然后将剩余的数再构造成一个大根堆
自己尝试
自己随便写了个数组试了试,还行