树结构实际应用

92 阅读1分钟

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

树结构实际应用

堆排序

基础介绍

  1. 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的 最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序

  2. 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值, 称为大顶堆

    • 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系
  3. 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆

    image-20220911154058077

    • 小顶堆:arr[i] <= arr[2 * i+1] && arr[i] <= arr[2 * i+2] // i 对应第几个节点,i从0开始编号
  4. 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆

    image-20220911153603198

    • 大顶堆特点:arr[i] >= arr[2 * i+1] && arr[i] >= arr[2 * i + 2]
    • i 对应第几个节点,i从0开始编号
  5. ==升序采用大顶堆,降序采用小顶堆==

基本思想

  1. 将待排序序列构造成一个大顶堆
  2. 序列的最大值就是堆顶的根节点
  3. 将其与末尾元素进行交换,此时末尾就为最大值
  4. 然后将剩余n-1个元素重新构造成一个堆,会得到n个元素的次小值。反复执行,便能得到一个有序序列

分析

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

  2. 结构:image-20220911155140497

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

    image-20220911155607764