堆排序
来源:互联网 发布:两钻淘宝店值多少钱 编辑:程序博客网 时间:2024/06/08 13:14
大体思路:1.一个树用数组存:i为一个结点的下标,则i*2是它的左孩子,i*2+1是它的右孩子。
2.写一个向下调整函数,将i,i*2,i*2+1中较大者调到i,如果本身最大则停止。
3.从n/2处开始向下调整,建立一个大顶堆。
4.建好大顶堆后h[i]则为最大的数,每次将最大的数放在最后n--,然后继续向下调整1。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int n,h[110];void Swap(int a, int b){ int t = h[a]; h[a] = h[b]; h[b] = t;}void siftdown(int i)//将i和它的左右孩子比较大小将较大的调整上来{ int t,flag = 0; while(i * 2 <= n && flag == 0) { if(h[i] < h [i*2]) t = i * 2; else t = i; if(i * 2 + 1 <= n) { if(h[i * 2 + 1] > h[t]) t = i * 2 + 1; } if(t != i) { Swap(i,t); i = t; } else flag = 1; }}void create()//创建一个堆{ for(int i = n/2;i >= 1;i--) { siftdown(i); }}void heapsort()//每次把最大的放在最后{ while(n > 1) { Swap(1,n); n--;///!! siftdown(1);// }}int main(){ int num; scanf("%d",&num); n = num; for(int i = 1;i <= num;i++) scanf("%d",&h[i]); create(); heapsort(); for(int i = 1;i <= num;i++) printf("%d ",h[i]); return 0;}
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 实时数据在网页中的实现
- 数据库输入String类型的姓名显示为“??”
- JS 中 this 的的常用方法
- 五十道编程小题目 --- 07 统计出其中英文字母、空格、数字和其它字符的个数 java
- ubuntu如何查看系统是多少位和系统版本号
- 堆排序
- 在MapReduce中连接Hbase数据
- HDU 1242 BFS+优先队列
- 开发环境:(1)配置JDK
- GBDT的深度理解
- 我的Android之旅(二十五)----handler总结(计时器)
- 设计模式<1>简单工厂和工厂方法
- 最小生成树问题 poj Building a Space Station
- OC中的宏 和 C中的预编译宏定义