排序算法——堆排序
来源:互联网 发布:苹果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