排序算法 | 堆排序
Posted dotzhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法 | 堆排序相关的知识,希望对你有一定的参考价值。
阅读文本大概需要 3 分钟。
本篇是对排序算法系列的堆排序的讲解。
堆排序是最好的排序方法之一,是一种稳定的算法,没有最坏情况下的运行时间。堆排序涉及从给定数组构建堆数据结构,然后利用堆对数组进行排序。
如何将数组转换为堆数据结构将有助于对数组进行排序。要理解这一点,让我们首先了解什么是堆。
什么是堆?
堆是一种特殊的基于树的数据结构,它满足以下属性
1. 完全二叉树,堆数据结构始终是完全二叉树。
2. 所有节点都大于或等于,小于或等于其子节点。如果父节点大于其子节点,则堆称为大根堆,如果父节点小于其子节点,则堆称为小根堆。
工作原理
堆排序主要包括两个部分,第一部分是创建未排序列表/数组的堆,第二部分是通过从堆中重复删除最大/最小元素并将其插入到数组中来创建排序数组,每次删除后重建堆。
最初在接收未排序的列表时,堆排序的第一步是创建堆数据结构(大根堆或小根堆)。构建堆之后,堆的第一个元素是最大的还是最小的(取决于大根堆或小根堆),因此将堆的第一个元素放在数组中。然后再次使用剩余元素创建堆,再次选择堆的第一个元素并将其放入数组中。继续反复进行,直到在数组中有完整的排序。
堆排序算法
void heapify(int arr[], int n, int i)
{
int largest = i;
int l = 2*i + 1;
int r = 2*i + 2;
if (l < n && arr[l] > arr[largest])
largest = l;
if (r < n && arr[r] > arr[largest])
largest = r;
if (largest != i)
{
swap(arr[i], arr[largest]);
heapify(arr, n, largest);
}
}
void heapSort(int arr[], int n)
{
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
for (int i=n-1; i>=0; i--)
{
swap(arr[0], arr[i]);
heapify(arr, i, 0);
}
}
下面是堆排序的复杂度分析的几种情况
1. 最坏情况下,时间复杂度为 O(nlogn)
2. 最佳情况下,时间复杂度为 O(nlogn)
3. 平均时间复杂度为 O(nlogn)
4. 空间复杂度为 O(1)
funnyZhang,不明真相的人
一条迷途的咸鱼,正在游向属于它的天地
恰同学少年风华正茂,数风流人物还看今朝
长按二维码关注funnyZhang
以上是关于排序算法 | 堆排序的主要内容,如果未能解决你的问题,请参考以下文章