文章标题

来源:互联网 发布:重庆时时彩开奖源码 编辑:程序博客网 时间:2024/06/06 14:09

1、首先排序的对象是顺序存储的;对于堆排序,如果是要进行升序排序,则需要定义大顶堆(将堆顶的最大元素放入排序对象的末尾,将末尾元素放到放到堆顶,然后在剩下的元素中进行堆排序)。如果是降序排序,则需要建立小顶堆;有序部分在对象的后面,无序部分在对象的前面,这是一个不断增长有序部分缩小无序部分的过程,直到无序部分只剩下一个元素。
2、三个函数(各自功能明确,层次感强):函数一:max_heapify(功能:在一个之前已经排序好的堆排序中,将堆顶的元素值变化时,函数将会把这个元素放到合适的位置上) 函数二:build_max_heap(功能:在一个大小为size的完全二叉树中,属于堆顶点的点为:0到(size/2 - 1) (为什么是size/2 -1,而不是size/2呢?因为元素是从下表为0开始的),将自底向上进行max_heapify函数,因此,顶堆就建好了) 函数三:heap_sort(功能:在需排序对象已经是顶堆的条件下,不断的将堆顶元素加入有序部分,在对无序部分进行max_heapify操作,再将堆顶元素放入有序部分,就是这么一个循环的过程将对象排列成有序)
3、max_heapify函数:传入参数为对象、某个需要调整的子树的根值、整个堆的大小。引入了largest_num变量,开始赋值为根值,然后保存根与两个左右子节点比较后的值最大的那个元素的下标(假设是大顶堆),如果largest_num没变,那么不再需要变化,函数调用完毕,如果变化了,那么就要将根节点和largest_num对应的值进行交换,然后递归调用自己函数。(注意:根是否两个子节点都存在,还是只存在左节点,还是两个左右子节点都不存在)
4、build_max_heap函数:传入的参数为需要建立顶堆的对象(本客介绍大顶堆)、堆的大小。自底向上,从最末尾的子树进行max_heapify操作,这样就形成了大顶堆。
5、heap_sort函数:传入的参数为对象、整个堆的大小。通过size-1次循环来形成有序对象,一次循环的操作有:将堆顶元素与末尾元素进行交换然后在调用max_heapify函数(传入对象以及size-1)

1 0
原创粉丝点击