堆排序

来源:互联网 发布:如何做人力资源矩阵图 编辑:程序博客网 时间:2024/06/08 02:34
1.
堆又成为二叉堆,因为堆就是一棵二叉树(堆就是一种树),而且是一棵近似的完全二叉树
堆排序时间:O(nlgn)
堆排序是原址排序
原址排序:就是任何时候只需常数个额外的元素空间存储临时数据
堆排序同时具有插入排序和归并排序的优点
2.
算法设计技巧:引入堆这种数据结构来设计算法
A.length:数组的元素个数
A.heap-size:堆中的元素个数
只有A[1..A.heap-size]存的才是堆的元素
3.
三种结点计算
父节点:[i/2](向下取整,即截断) (将i右移1位,即可得到[i/2]的向下取整)
左孩子:2i (将i左移一位)
右孩子: 2i + 1 (将i左移一位,并在低位加1)
求左孩子、右孩子、父节点都可以用左移或右移操作,将i的值左移或右移一位(如果求右孩子要先左移一位再在低位加1),即可以快速求左孩子、右孩子及父节点
高度 = 杆数 层数 = 高度 + 1 最底层高度最小,为0
堆分为两种,最大堆和最小堆
最大堆:子结点的值最多和父节点一样大(小于等于父节点)
堆排序用的是最大堆,优先队列一般用最小堆
堆的高度:堆的高度就是根结点的高度
4.
堆有7种操作
①max-heapify(维护最大堆的性质)  时间O(lgn)
②build-max-heap(建堆):将一个无序数组建成最大堆  时间O(n)
③heapsort(堆排序):对一个数组进行原址排序  时间O(nlgn)
④max-heap-insert      时间O(lgn)
⑤heap-extract-max     时间O(lgn)
⑥heap-increase-key    时间O(lgn)
⑦heap-maximum         时间O(lgn)
④、⑤、⑥、⑦均为优先队列的操作


5.
定理1:一个堆的高度是theta(lgn)
定理2:堆上的一些基本操作时间最多与堆(树)的高度成正比,即时间为O(lgn)
定理3:高度为h的堆,最多可能有2^(h+1)-1个元素(当堆为完全二叉树时元素最多),最少可能有2^h个元素,因此当堆元素最多时,元素个数一定为一个奇数,最少元素一定为一个偶数
定理4:树的高度h<lgn,因此树高h=[lgn](向下取整)
原创粉丝点击