堆排序(heapsort)是一种比较快速的排序方式,它的
时间复杂度为O(nlgn),并且
堆排序具有空间原址性,任何时候只需要有限的空间来存储临时数据。我将用c++实现一个
堆来简单分析一下。
堆排序的基本思想为:
1、升序排列,保持大
堆;降序排列,保持小
堆;
2、建立
堆之后,将
堆顶数据与
堆中最后一个数据交换,
堆大小减一,然后向下调整;直到
堆中只剩下一个有效值;
下面我将简单分析一下:
第一步建立
堆:
1、我用vector顺序表表示数组;
2、用仿函数实现大小
堆随时切换,实现代码复用;
3、实现向下调整算法,
时间复杂度为O(lgn);
下面是我用某教材中的一个建
最小堆的过程图,希望能更直观一些:
本来想写
堆以及优先队列的,现在就只简单写写
堆吧,先不写别的了,先把
堆搞明白。
堆是什么
堆是一个 完全二叉树,每一个节点的值都必须 大于等于 或者 小于等于 其孩子节点的值。
堆的特点
插入 的
时间复杂度:O(lgn)
删除 的
时间复杂度:O(lgn)
获取最大值/最小值的
时间复杂度:O(1)
最大堆/
最小堆
最大堆:每一个节点的值都必须 大于等于 其孩子节点的值。
最小堆:每一个节点的值都必须 小于等于 其孩子节点的值。
构建最大堆
构建最大堆的步骤分为一下几步:
把要插入的元素插入到
堆中
现在常有两种建堆的方法,而这两种方法又有着不同的时间复杂度。下面分别陈述:
(1)自顶向下的建堆方式
这种建堆的方法具有O(n*log2n)的时间复杂度。从根结点开始,然后一个一个的把结点插入堆中。当把一个新的结点插入堆中时,需要对结点进行调整,以保证插入结点后的堆依然是大根堆。
其中h = log2(n+1)-1,第k层结点个数为2k个(当然最后一层结点个数可能小于2h)。第k层的一个结点插入之...
1)
堆结构就是用数组实现的完全二叉树结构。(完全二叉树:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。)
2)完全二叉树中如果每棵子树的最大值都在顶部就是大根
堆
3)完全二叉树中如果每棵子树的最小值都在顶部就是小根
堆
4)
堆结构的heapInsert(插入)与heapify(调整)操作
5)
堆结构的增大和减少
6)优先级队列结构,就是
堆结构
语言提供的
堆结构 vs 手写的
堆结构
取决于我们有没有动态改信息的需求。
语言提供的
堆结构,如果你动态改数据,不保证依然有序
[ 手写
堆
3、左右节点的值都比当前节点的大
从定义可知,根节点是树中的最小值,
最小堆一般用链表存储,父子节点的关系,用纯数学的关系表示为:假设当前节点的在链表中的索引为n,左子节点为2n+1 ,右子节点为2n+2
void swap(int *a, int *b);
void adjustHeap(int param1,int j, int inNums[]);
void HeapSort(int nums, int inNums[]);
//大根
堆进行调整
void adjustHeap(int param1, int j, i