排序算法——堆排序

来源:互联网 发布:苹果4s如何变成4g网络 编辑:程序博客网 时间:2024/06/16 21:17

基本思想

堆排序是一种树形选择排序,是对直接选择排序的改进。

首先,我们来看看什么是堆(heap):
(1)堆中某个节点的值总是不大于或不小于其父节点的值;
(2)堆总是一棵完全二叉树(Complete Binary Tree)。
完全二叉树是由满二叉树(Full Binary Tree)而引出来的。除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树称为满二叉树。
如果除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点,这样的二叉树被称为完全二叉树。

这里写图片描述

一棵完全二叉树,如果某个节点的值总是不小于其父节点的值,则根节点的关键字是所有节点关键字中最小的,称为小根堆(小顶堆);如果某个节点的值总是不大于其父节点的值,则根节点的关键字是所有节点关键字中最大的,称为大根堆(大顶堆)。
从根节点开始,按照每层从左到右的顺序对堆的节点进行编号:
这里写图片描述
可以发现,如果某个节点的编号为i,则它的子节点的编号分别为:2i、2i+1。据此,推出堆的数学定义:
具有n个元素的序列(k1,k2,…,kn),当且仅当满足
这里写图片描述
时称之为堆。
需要注意的是,堆只对父子节点做了约束,并没有对兄弟节点做任何约束,左子节点与右子节点没有必然的大小关系。

如果用数组存储堆中的数据,逻辑结构与存储结构如下:
这里写图片描述

堆排序:
初始时把要排序的n个数看作是一棵顺序存储的完全二叉树,调整它们的存储顺序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依次类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。

动画演示:
http://www.cs.usfca.edu/~galles/visualization/HeapSort.html

代码:
包括正常算法和数组仿堆两种代码

http://blog.csdn.net/gx17864373822/article/details/78856983

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 离婚后复婚算二婚吗 新婚姻法关于二婚房产 1987每属兔一生有二婚 1977年属蛇一生有二婚 1975每属兔一生有二婚 二嫫 嬢嬢 嬢嬢的读音 堕落令嬢 紧缚令嬢 紧缚令嬢系列 堕落令嬢theanimation 魔道祖师第二季 魔道祖师二季 西行记第二季 菲梦少女二季 就是灌篮第二季 灌篮第二季 西行记第二季免费观看 就是街舞第二季 向往生活第二季 西行记第二季观看 西行纪第二季免费观看 街舞第二季 声入人心第二季 西行纪第二季在线播放 都铎王朝第二季 西行纪第二季 相亲大会第二季 荒野求爱第二季 国民老公第二季 星辰变第二季 亲吻姐姐二季 十三邀第三季 三季 overlor第三季 十三邀第二季 这就是灌篮第二季 黑袍纠察队第二季 新相亲大会第二季