堆排序
来源:互联网 发布:电视机网络电视怎么调 编辑:程序博客网 时间:2024/06/13 14:43
/构造一个最大堆,然后反着输出去#include<stdio.h>int h[101];int n;void swap(int x, int y){ int t; t = h[x]; h[x] = h[y]; h[y] = t;}void siftdown(int i)//需要向下调整的编号 需要的是最大堆 父节点小于子节点都要调整{ int t, flag = 0; while(i*2<=n && flag == 0) { if(h[i] < h[i*2]) // 父节点小于左儿子 t = i*2;//t 记录左儿子的下标 else t = i;//if父节点大于左儿子 t 还是 i本身 if(i*2+1<=n) { if(h[t] < h[2*i+1])//目前的下标与右儿子去比较 t = 2*i+1; } //此时的t记录的就是值最大的下标 儿子中找个最大的 if(t!=i)//如果不是本身,那么就进行交换 { swap(t,i); i = t; //把t赋给i继续向下调整 t是目前值最大的下标 交换后 t就成为父节点 } else flag = 1;//t 就是i了 说明父节点值大于两个儿子的值 已调整完毕 }}void creat(){ int i; for(i = n/2;i>=1;i--)//叶节点不需要调整 从叶节点上一层开始调整 直到根节点 { siftdown(i); }}void headsort(){ while(n>1) { swap(1,n);//h[1]原来是最大的 现在与h[n]交换 一步步固定当前最大的数 n--; siftdown(1); }}int main(){ int i, num, sum = 0, j = 1; scanf("%d",&num); for(i=1; i<=num; i++) scanf("%d",&h[i]); n = num; creat(); headsort(); for(i = 1; i <= num; i++) printf("%d ",h[i]);}
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- HIbernate多对多_查询
- 求二叉树叶子节点的个数/求二叉树第k层的节点个数/一个数组中有一个数字的次数超过了数组的一半,求出这个字符
- 【bzoj1529】 [POI2005]ska Piggy banks
- LLT测试 -读写BIN文件
- 实验吧-因缺思汀的绕过WriteUp
- 堆排序
- 常见类---Object类
- 3126 & [kuangbin带你飞]专题一 简单搜索 F
- java继承,多态及相关学习笔记
- 【bzoj1121】 [POI2008]激光发射器SZK
- 1049. Counting Ones (30)计算1的个数
- Android自定义View之实现流行的底部菜单栏中间突起:高仿“咸鱼APP”的底部菜单。
- traceroute
- Code Forces 588A