数据结构 —— 堆排序

来源:互联网 发布:傲剑神照升级数据大全 编辑:程序博客网 时间:2024/05/24 01:45
一般用数组来表示堆,若根结点存在序号0处, i结点的父结点下标就为(i-1)/2。i结点的左右子结点下标分别为2*i+1和2*i+2。
(注:如果根结点是从1开始,则左右孩子结点分别是2i和2i+1。)




堆:堆是完全树;
分为大顶堆和小顶堆;大顶堆要求每一个父节点的值大于子节点的值,并且所有子树都是大顶堆(结果是根节点是最大的数)
   小顶堆要求每一个父节点的值小于子节点的值,并且所有子树都是小顶堆(结果是根节点是最小的数)


堆排序:  若在输出堆顶的元素后,使得剩余的n-1个元素的序列重又建成一个堆,则得到的n个元素中的次小值。如此反复执行,便能得到一个有序序列,这个过程称为堆排序。
因此实现堆排序要解决两个问题,1:如何使一个无序序列建成一个堆?
    2:如何在输出堆顶元素之后,调整剩余元素成为一个新的堆?


即无论如何,别忘了最终目的是将一个无序序列转换为一个有序序列,即最后目的不是要得到一个堆,而是一个有序序列,堆只是一个过程,所以一个堆取一个根元素,然后与最后一个元素互换位置,这时堆的结构被破坏,需要重新建立堆,然后再取得一个根元素,这样重复,到最后得到一个有序序列。




我们称自堆顶叶子的调整过程为筛选。(筛选不涉及最后一个元素和根元素的互换,只涉及互换之后的建堆过程):即一个完全树除了根元素以外他的左右子树都是堆,假设建立一个大顶堆:首先将根元素与左右子树根节点值比较,将比根元素大的节点的值与根元素的值互换,假设是左子树,这时,左子树由于根节点值改变,破坏了左子树的堆,需进行和上述相同的操作(此步不进行根节点和最后一个节点互换操作),直到产生一个新的堆,这时再将根节点输出,将最后一个节点换到根节点,在进行上述操作,直到所有元素均被输出。
原创粉丝点击