堆排序的分析与思路

127 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言:上文讲到堆排序的分析,今天带领大家温习并完成接下来的学习~

分析

  1. 构造初始堆。给定无序序列构造成一个大顶堆。原始数组[4、6、8、5、9]

  2. 结构:image-20220911155140497

  3. 从最后一个==非叶子节点== 开始(叶子节点不用调整)第一个==非叶子节点位置==: arr.length / 2-1。==从上自下,从左至右== 进行调整

    image-20220911155607764

  4. 找到第二个叶子节点,由于【4,9,8】中9 最大,4 和 9 交换。9与8 比较后,不需交换

    image-20220911155808569

  5. 这时,交换导致字根【4,5,6】结构混乱,继续调整【4,5,6】,4和6交换

    image-20220911155952605

    此时得到一个无序的大顶堆

  6. 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后调整,再将堆顶元素与末尾元素交换,得到第二大元素。反复进行交换,调整(重建),交换。

    1. 将堆顶元素 9 与末尾元素 4 交换

      image-20220911160451158

    2. 重新调整构造,使其继续满足堆定义

      image-20220911160614245

    3. 再将堆顶元素 8 与末尾元素 5 进行交换,得到第二大元素 8

      image-20220911160712757

    4. 不断重复 上面 1 2 3 步最终得到一个有序序列

      image-20220911160912777

堆排序的基本思路

  1. 将无序序列构建成一个堆,根据升序降序选择大堆顶或者小堆顶
  2. 将堆顶元素与末尾元素交换,将最大元素 "沉" 到数组末端
  3. 重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整 + 交换步骤,直到整个序列有序。