本文已参与「新人创作礼」活动,一起开启掘金创作之路。
树结构实际应用
堆排序
基础介绍
-
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的 最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序
-
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值, 称为大顶堆
- 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系
-
每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
- 小顶堆:arr[i] <= arr[2 * i+1] && arr[i] <= arr[2 * i+2] // i 对应第几个节点,i从0开始编号
-
每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆
- 大顶堆特点:arr[i] >= arr[2 * i+1] && arr[i] >= arr[2 * i + 2]
- i 对应第几个节点,i从0开始编号
-
==升序采用大顶堆,降序采用小顶堆==
基本思想
- 将待排序序列构造成一个大顶堆
- 序列的最大值就是堆顶的根节点
- 将其与末尾元素进行交换,此时末尾就为最大值
- 然后将剩余n-1个元素重新构造成一个堆,会得到n个元素的次小值。反复执行,便能得到一个有序序列
分析
-
构造初始堆。给定无序序列构造成一个大顶堆。原始数组[4、6、8、5、9]
-
结构:
-
从最后一个==非叶子节点== 开始(叶子节点不用调整)第一个==非叶子节点位置==: arr.length / 2-1。==从上自下,从左至右== 进行调整