堆排序
堆排序(Heap Sort)是一种基于二叉堆这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组来模拟一个堆的结构。堆排序可以分为两个主要阶段:建堆和堆调整排序。
原理:
堆排序利用了堆(heap)这一数据结构所设计。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
建堆:将待排序的序列构造成一个大顶堆(或小顶堆)。此时,整个序列的最大值(或最小值)就是堆顶的根节点。
堆调整排序:将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个序列重新构造成一个堆,这样会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列了。
实现:
以下是堆排序的Python实现:
1 | def heapify(arr, n, i): |
在这个实现中,heapify
函数用于维护堆的性质,它确保以i
为根的子树是一个大顶堆。heapSort
函数首先构建一个大顶堆,然后依次将堆顶元素(即当前最大值)与末尾元素交换,并重新调整堆,直到整个数组有序。
注意:
堆排序的时间复杂度是O(n log n),其中n是待排序元素的数量。它相对稳定,并且空间复杂度较低,除了隐式使用的调用栈外,不需要额外的空间。
堆排序不是稳定的排序算法,即如果序列中存在两个相等的元素,堆排序可能会改变它们的相对位置。
堆排序在构建初始堆时,需要从最后一个非叶子节点开始向上进行调整,因此其建堆的时间复杂度是O(n)。而整个排序过程包括建堆和n-1次堆调整,所以总的时间复杂度是O(n log n)。
评论