堆排序
来源:互联网 发布:linux python27 pyqt5 编辑:程序博客网 时间:2024/05/20 05:54
堆又叫二叉堆,是一种常用的数据结构。在实现中,有最大堆和最小堆两种。最小堆常常用于优先队列,堆也可以用于排序。
以最小堆为例:
最小堆中,一个结点的值不大于它的孩子。
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ /
8 9 10
可以用数组实现堆得结构
图中位置为:0 1 2 3 4 5 6 7 8 9
可以看出父结点、左孩子、右孩子关系如下:
leftchild(i)=2*i+1
rightchild(i)=2*i+2
parent(i)=(i-1)/2;
向堆中添加一个元素时,添加到末尾;这时候可能破坏了堆得性质,因此要维护堆。添加在末尾,只要向上维护即可。
判断添加后是否满足堆的性质,不满足则维护这个结点。判断其父结点和父结点的左右两个孩子结点,最小的作为父结点。
之后再判断父结点是否满足堆得性质,不满足再向上维护。
从堆中删除结点时,要从堆顶删除。因为这个值是最值(最小堆的话就是最小值),之后把这个末尾结点放到堆顶。这样就破坏了堆
以最小堆为例:
最小堆中,一个结点的值不大于它的孩子。
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ /
8 9 10
可以用数组实现堆得结构
图中位置为:0 1 2 3 4 5 6 7 8 9
可以看出父结点、左孩子、右孩子关系如下:
leftchild(i)=2*i+1
rightchild(i)=2*i+2
parent(i)=(i-1)/2;
向堆中添加一个元素时,添加到末尾;这时候可能破坏了堆得性质,因此要维护堆。添加在末尾,只要向上维护即可。
判断添加后是否满足堆的性质,不满足则维护这个结点。判断其父结点和父结点的左右两个孩子结点,最小的作为父结点。
之后再判断父结点是否满足堆得性质,不满足再向上维护。
从堆中删除结点时,要从堆顶删除。因为这个值是最值(最小堆的话就是最小值),之后把这个末尾结点放到堆顶。这样就破坏了堆
的性质,向下维护堆,直到叶子结点。
堆排序时,以升序为例,可以用最小堆,每次取出堆顶元素(最小值),放到另外一个地方存储,这对内存要求为O(2N)。
也可以用最大堆,把堆顶元素(最大值)依次放到存储堆得(数组或vector)的最后一个位置,堆得大小相应的减一。
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 常见类---Scanner类
- 计算机字符编码详解二
- Codeforces Round #426 (Div. 2)
- 最长公共子序列
- Android 5.1源代码目录
- 堆排序
- ServiceHot IT学院——ITSS 8月开班通知
- ubuntu14.04中更改python版本
- Android网络编程(二)HttpClient与HttpURLConnection
- Centos7单网卡搭建pptp服务
- RxJava 和 RxAndroid 五(线程调度)
- kettle入门(1)
- 策略模式
- SBL1启动