堆
堆和优先队列:
优先队列是一种抽象的数据类型,而堆是一种数据结构,所以堆并不是优先队列,堆是实现优先队列的一种方式。
实现 优先队列 的方式有很多种,比如数组和链表。但是,这些实现方式只能保证插入操作和删除操作中的一种操作可以在 O(1)O(1) 的时间复杂度内完成,而另外一个操作则需要在 O(N)O(N) 的时间复杂度内完成。而 堆 能够使 优先队列 的插入操作在 O(log N)O(logN) 的时间复杂度内完成,删除操作在 O(log N)O(logN) 的时间复杂度内完成。
堆是一种特别的二叉树,满足以下条件:
1、完全二叉树(从左到右依次放入节点);
2、每一个节点的值都必须大于等于或者小于等于其孩子节点的值。
堆的特点:
1、可以在O(logN)的时间复杂度内向堆中插入元素;
2、可以在O(logN)的时间复杂度内从堆中删除元素;
3、可以在O(1)的时间复杂度内获取堆中最大值或最小值。
堆的分类:
最大堆:堆中每一个节点的值都大于等于其孩子节点的值。最大堆的堆顶元素(根结点)是堆中的最大值。
最小堆:堆中每一个节点的值都小于等于其孩子节点的值。最小堆的堆顶元素(根结点)是堆中的最小值。
当前节点编号i,左孩子的编号2i,右孩子的编号2i+1。
时间复杂度和空间复杂度
堆排序
理论:堆排序指的是利用堆的数据结构对一组无序元素进行排序。
最小堆 排序算法步骤如下:
将所有元素堆化成一个 最小堆 ;
取出并删除堆顶元素,并将该堆顶元素放置在存储有序元素的数据集 T 中;
此时,堆 会调整成新的 最小堆;
重复 3 和 4 步骤,直到 堆 中没有元素;
此时得到一个新的数据集 T,其中的元素按照 从小到大 的顺序排列。
最大堆排序算法步骤如下:
将所有元素堆化成一个 最大堆;
取出并删除堆顶元素,并将该堆顶元素放置在存储有序元素的数据集 T 中;
此时,堆 会调整成新的 最大堆;
重复 3 和 4 步骤,直到 堆 中没有元素;
此时得到一个新的数据集 T,其中的元素按照从大到小的顺序排列。
时间复杂度:O(Nlog N)。N是堆中的元素个数。
空间复杂度:O(N)。N是堆中的元素个数。