一、小根堆的实现、第一种堆排序
- 输入一组数据;
- 创建一个小根堆:从最后一个非叶子结点到第1个结点依次进行向下调整;
- 新增一个值:将新元素插入到末尾,再根据情况判断新元素是否需要上移,直到满足堆的特征为止;
- 【第一种堆排序】从小到大排序:对于小根堆,每次将顶部元素输出并删除顶部元素(最后一个元素移至顶部,堆的大小减1,继续向下调整),直到堆空。
测试示例
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
Y
55
#include <stdio.h>
int h[101];//用来存放堆的数组
int n;//用来存储堆中元素的个数,也就是堆的大小
//交换函数,用来交换堆中的两个元素的值
void swap(int x,int y){
int t=h[x];
h[x]=h[y];
h[y]=t;
}
//向下调整函数
void siftdown(int i){
//传入一个需要向下调整的结点编号i.这里传入1,即从堆的定点开始向下调整
int t,flag=0;//flag用来标记是否需要继续向下调整
//当i结点有儿子(至少有左儿子)并且有需要继续调整的时候循环就执行
while(i*2<=n&&flag==0){
//首先判断它和左儿子的关系,并且用t记录较小的结点编号
if(h[i]>h[i*2])
t=i*2;
else
t=i;
//如果它有右儿子,再对右儿子进行讨论
if(i*2+1<=n)
if(h[i*2