堆排序
堆排是基于堆的一种排序算法,对于堆的了解请点开链接:https://blog.csdn.net/z_x_m_m_q/article/details/82320357(创建、插入、删除)
算法思想:
之前的博客写了小堆,由于降序排列是根据小堆性质进行排列的,顺着前面的知识这里我们讨论从大到小的排列
首先小堆建好之后堆顶数据是堆中最小的数据,将堆顶元素与最后的一个元素交换位置,这样最后元素就出在有序区间了。再对除有序区间外的其他数据从堆顶开始来一次向下调整,这样堆顶数据又是堆中最小的数据,重复上述步骤直至堆中只剩下一个元素。
以具有N个数据的数组 a[N] 为例,说下对排序的步骤:
- 利用数组中元素建立节点量为 N 的小堆
- 第一次将a[0] 与 a[N-1]交换位置,对a[0]至a[N-2]进行一次向下调整,重新恢复成小堆(此时堆的节点量为N-1)
- 第二次将a[0] 与 a[N-2]交换位置,对a[0] 至 a[N-3]进行一次向下调整,重新恢复成小堆(此时堆的节点量变为n-2)
- 重复这样的操作,直至 a[0] 与 a[1]交换
图形分析: