堆排序是利用堆这种数据结构所设计的一种排序算法,堆是一个近似完全二叉树的结构,堆排序中我们用到的堆满足一个性质,孩子节点的值总是大于等于或者小于等于它的父亲节点的值,根节点最大的我们叫做大顶堆,根节点最小的叫做小顶堆(可以先自己学一下,实在不懂的话等我后续)
堆排序的思想分为两步:
- 构建初始堆,把待排序的数组构建成大顶堆或者小顶堆
- 将堆顶元素与最后一个元素交换,并将最后一个元素从堆中断开
- 重新构建堆
- 重复2、3步,直到堆中只剩下一个元素
以大顶堆为例,构建堆的时候,如果新插入的数据比父亲节点要大,那么就和父节点进行交换,直到父节点大于等于当前节点为止;堆顶元素与最后一个元素进行交换,就是把最大的数放在最后面,因为最大的数位置确定了,所以要把它从堆中断开,如果没有断开,再拿别的数和他交换就会乱掉;交换完之后之前在堆末尾的一个比较小的数就到了堆顶,这事就需要对堆进行重新排序,让堆重新变为大顶堆,具体步骤是拿堆顶节点和它的两个孩子节点作比较,如果孩子节点更大,就进行交换,如果两个孩子节点都比父节点大,那就交换更大的那个,例如左孩子节点大于右孩子节点大于父节点,那就是用左孩子结点和父节点进行交换,直到变成一个新的大顶堆;重复2、3步骤,就可以每次把堆中剩余的数中的最大值拿到最后面,最后就可以得到一个从小到大排序的数组