堆的原理及堆排序

堆的概念及类别:

堆作为一种特殊的数据结构,它的本质其实就是一颗完全二叉树。只不过这颗完全二叉树的父子节点数量关系是严格的。

在此基础上我们把堆分为大根堆和小根堆,大根堆即每个父节点都必须大于等于它的子节点,小根堆即每个父节点都必须小于等于它的子节点。

【这里尤其要注意的是,堆结构对兄弟节点的大小关系不做任何要求,这是一个常见的易混淆点

堆的原理及堆排序_第1张图片

堆的物理结构及增删操作:

由于堆是一颗完全二叉树,我们可以通过数组的方式来实现堆,这里回顾一下完全二叉树的父子节点下标关系,child=parent*2+1  or  child=parent*2+2  and parent=(child-1)/2;

关于堆结构的增删操作,下面接通过小根堆为例做出演示:

        增:在堆末尾插入(即数组尾插),再通过向上调整算法来实现数据的挪动

堆的原理及堆排序_第2张图片

代码实现:

堆的原理及堆排序_第3张图片堆的原理及堆排序_第4张图片堆的原理及堆排序_第5张图片

        

        删:默认规定从堆顶元素删除,将堆顶和堆底元素进行交换,数组size减1,再通过向下调整算法将原来的堆底元素进行调整。(向下调整和向上调整算法原理相似,这里不做过多演示,留给读者自行实现)

堆排序:

大致流程:

                                                建立数组->建堆->出堆

①建立数组,申请一块已知空间的小的数组(以7为例),随机输入7个不相等的元素

②建堆

        1、向上调整建堆和向下调整建堆的优劣堆的原理及堆排序_第6张图片

通过上述分析我们可以知道向下调整建堆的效率要胜于向上调整,故而我们推荐建立堆时使用向下调整建堆。

③出堆

出堆操作结束后我们会发现数组中的元素是a=[7,6,5,4,3,2,1],呈现逆序的效果,因此我们得出如果要进行降序堆排序,我们需要建立小根堆再进行出堆操作,反之同理。(这里需要牢记,经常会受到大小根堆的特性而搞混)

至此文章结束,感谢阅读,支持新人的话点个赞关注一下咯,蟹蟹!

你可能感兴趣的:(算法,数据结构,c语言)