排序算法 | 堆排序

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

以上是关于排序算法 | 堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

堆排序算法的实现

7.2堆排序的代码分析(算法基础—排序算法)

算法-java代码实现堆排序

十大经典排序算法总结(堆排序)

『算法设计_伪代码』堆排序