本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言:上文讲到堆排序的分析,今天带领大家温习并完成接下来的学习~
分析
-
构造初始堆。给定无序序列构造成一个大顶堆。原始数组[4、6、8、5、9]
-
结构:
-
从最后一个==非叶子节点== 开始(叶子节点不用调整)第一个==非叶子节点位置==: arr.length / 2-1。==从上自下,从左至右== 进行调整
-
找到第二个叶子节点,由于【4,9,8】中9 最大,4 和 9 交换。9与8 比较后,不需交换
-
这时,交换导致字根【4,5,6】结构混乱,继续调整【4,5,6】,4和6交换
此时得到一个无序的大顶堆
-
将堆顶元素与末尾元素进行交换,使末尾元素最大。然后调整,再将堆顶元素与末尾元素交换,得到第二大元素。反复进行交换,调整(重建),交换。
-
将堆顶元素 9 与末尾元素 4 交换
-
重新调整构造,使其继续满足堆定义
-
再将堆顶元素 8 与末尾元素 5 进行交换,得到第二大元素 8
-
不断重复 上面 1 2 3 步最终得到一个有序序列
-
堆排序的基本思路
- 将无序序列构建成一个堆,根据升序降序选择大堆顶或者小堆顶
- 将堆顶元素与末尾元素交换,将最大元素 "沉" 到数组末端
- 重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整 + 交换步骤,直到整个序列有序。