堆排序(大顶堆、小顶堆)----C语言
堆排序 之前的随笔写了栈( 顺序栈 、 链式栈 )、队列( 循环队列 、 链式队列 )、 链表 、 二叉树 ,这次随笔来写堆 1、什么是堆? 堆是一种 非线性结构 ,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲 堆其实就是利用完全二叉树的结构来维护的一维数组 按照堆的特点可以把堆分为 大顶堆 和 小顶堆 大顶堆:每个结点的值都 大于 或 等于 其左右孩子结点的值 小顶堆:每个结点的值都 小于 或 等于 其左右孩子结点的值 ( 堆的这种特性非常的有用,堆常常被当做优先队列使用,因为可以快速的访问到“最重要”的元素 ) 2、堆的特点(数组实现) (图片来源:https://www.cnblogs.com/chengxiao/p/6129630.html) 我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子 (图片来源:https://www.cnblogs.com/chengxiao/p/6129630.html) 我们用简单的公式来描述一下堆的定义就是:(读者可以对照上图的数组来理解下面两个公式) 大顶堆: arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆: arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] 3、堆和普通树的区别 内存占用