堆排序)
概念
- 概念
- 算法实现
- 后续
- 堆排序要结合顺序存储的完全二叉树的特性进行学习。 对于完全二叉树而言:
- 结点 i 的左孩子是 2i
- 结点 i 的右孩子是 2i+1
- 结点 i 的父节点是 i/2
- 编号 =L(2i) 且 L(i)>=L(2i+1) 可以将该一维数组视为一棵完全二叉树,满足此条件的堆称之为大根堆。大根堆的最大元素存放在根节点,且其任一非根节点的值小于等于其双亲结点值。 小根堆反之。
- 堆排序的思路很简单:首先将存放在L[1…N]中的N个元素建成初始堆,由于堆本身的特点(以大根堆为例),堆顶元素就是最大值。输出堆顶元素后,通常将堆底元素送入堆顶,此时根节点已不满足大顶堆的性质,对被破坏,将堆顶元素向下调整使其继续保持大顶堆的性质,再输出堆顶元素。如此重复,直到堆中仅剩一个元素为止。
- 构建初始堆的方法:先对完全二叉树的最右下边的子树调整,使其成为堆(如果此节点的孩子有比他大的,则将最大的孩子和父节点调换),之后向前依次对各节点([N/2]-1~1)为根的子树进行筛选,看该节点是否大于其左右孩子的值,若不大于则交换,交换后可能会破坏下一级的堆,于是采用上述方法继续构建下一级的堆,直到以该节点为根的子树构成堆为止。反复利用上述调整堆的方法建堆,直到根节点。
#include
#include
#include
void BuildMaxHeap(int a[],int size);
void HeadAdjust(int a[],int k,int size);
void HeapSort(int a[],int size);
int main()
{
int k;
int num[9]={NULL,8,7,4,6,5,1,2,3};
int sortsize=sizeof(num)/sizeof(num[0]);
HeapSort(num,sortsize-1);
for(k=1;k0;i--)
HeadAdjust(a,i,size);
}
void HeadAdjust(int a[],int k,int size)
{
int i,j;
int temporary;
temporary=a[k];
for(i=2*k;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?