type
status
date
slug
summary
tags
category
icon
password
整理定义
出处 | 定义 |
中国大百科全书 | 堆是一种近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序是指利用堆这种数据结构所设计的一种排序算法。 |
In computer science, heapsort is a comparison-based sorting algorithm which can be thought of as "an implementation of selection sort using the right data structure."[3] Like selection sort, heapsort divides its input into a sorted and an unsorted region, and it iteratively shrinks the unsorted region by extracting the largest element from it and inserting it into the sorted region. Unlike selection sort, heapsort does not waste time with a linear-time scan of the unsorted region; rather, heap sort maintains the unsorted region in a heap data structure to efficiently find the largest element in each step.
Although somewhat slower in practice on most machines than a well-implemented quicksort, it has the advantages of very simple implementation and a more favorable worst-case O(n log n) runtime. Most real-world quicksort variants include an implementation of heapsort as a fallback should they detect that quicksort is becoming degenerate.
【在计算机科学中,堆排序是一种基于比较的排序算法,可以将其视为“使用正确数据结构的选择排序的实现”。与选择排序一样,堆排序将其输入分为已排序区域和未排序区域, 它通过从中提取最大元素并将其插入已排序区域来迭代地缩小未排序区域。 与选择排序不同,堆排序不会浪费时间对未排序区域进行线性时间扫描; 相反,堆排序维护堆数据结构中的未排序区域,以有效地找到每个步骤中的最大元素。
虽然在大多数机器上实践中比实现良好的快速排序要慢一些,但它具有实现非常简单和更有利的最坏情况 O(nlogn) 运行时间的优点。 大多数现实世界的快速排序变体都包含堆排序的实现,作为它们检测到快速排序正在退化的后备方案。 堆排序是一种就地算法,但它不是一种稳定的排序。】 |
复述展开
前置概念
在理解堆排序之前,需要了解下什么是堆?
另外,还有两个概念需要了解:
大顶堆(最大堆,大根堆):指的是最大元素在根节点(root)的堆,它的根节点始终大于它的子节点
小顶堆(最小堆,小根对):指的是最小元素在根节点(root)的堆,它的根节点始终小于它的子节点
堆排序就是利用堆的这一特性进行数据的排序。
算法原理
- 建堆,将数据转化为一维数组表示的初始化堆(大顶堆),长度为N
- 将根节点(最大值)与节点 N 交换值,然后调整堆,使之满足大顶堆。
- N = N-1
- 重复2-3步骤,直至N=0,此时所有节点都排好序。
代码实现
算法分析
- 稳定性 :不稳定
- 时间复杂度 :最佳:O(nlogn), 最差:O(nlogn), 平均:O(nlogn)
- 空间复杂度 :O(1)
建堆,最多遍历所有的数据,时间复杂度是O(n)
交换N次,每次交换的时间复杂度为O(logn),所以是 O(nlogn)
最终是 O(nlogn+n) 也就是 O(nlogn)
理解体会
堆排序是一种基于二叉堆数据结构的排序算法。它的核心思想是将待排序的序列构建成一个最大堆(或最小堆),然后逐步将堆顶元素与堆的最后一个元素交换,并重新调整堆,使得剩余元素仍满足堆的性质。通过不断重复这个过程,最终得到一个有序的序列。
堆排序的过程可以分为两个主要的步骤:构建堆和堆的调整。
首先,构建堆的过程是将待排序的序列转化为一个堆。可以从最后一个非叶子节点开始,逐个向前进行调整,保证每个节点都满足堆的性质。这个过程称为堆的建立或堆化。
其次,堆的调整是在每次交换堆顶元素与堆的最后一个元素后,重新调整堆,使得剩余元素仍满足堆的性质。通常,堆的调整是从堆顶开始,将堆顶元素与其子节点进行比较,找到最大(或最小)的元素,并将其与堆顶元素交换。然后,继续向下调整交换后的子节点,直到整个序列重新满足堆的性质。
重复进行堆的调整,直到堆中只剩下一个元素,整个序列就变成了有序的。
堆排序的优点是具有较好的时间复杂度,平均和最坏情况下的时间复杂度均为O(nlogn),其中n是待排序序列的长度。堆排序也是一种原地排序算法,不需要额外的空间。此外,堆排序适用于大规模数据集,对于需要稳定排序的情况,可以通过一些额外的操作来实现。
然而,堆排序的缺点是不稳定,即在排序过程中相等元素的相对顺序可能会改变。此外,堆排序的实现较为复杂。
快速跳转链接
【概念解析】启动
【概念解析】Day 1 - 10
【概念解析】Day 11 - 20
【概念解析】Day 21 - 30
【概念解析】Day 31 - 40
【概念解析】Day 41 - 50
【概念解析】Day 51 - 60
【概念解析】Day 61 - 70
【概念解析】Day 71 - 80
【概念解析】Day 81 - 90
- 作者:eachenkuang
- 链接:https://kuangyichen.com/article/industry-day21
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。