堆排序
来源:互联网 发布:java语言的就业前景 编辑:程序博客网 时间:2024/06/18 12:45
今天看一个题是关
于堆排序的,发现自己对堆了解的太少,百度知到了堆排序的写法,下面就是堆排序对一个序列排序写法
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<vector>#include<set>#include<map>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MID(x,y) ((x+y)>>1)#define eps 1e-8using namespace std;#define N 1005void Headadjust(int *a,int pos,int len){ int big=pos;//将pos与左右孩子比较,最大的放在pos这个位置 int le=pos*2; int ri=pos*2+1; if(le<=len&&a[le]>a[big]) big=le; if(ri<=len&&a[ri]>a[big]) big=ri; if(big!=pos)//然后将那个最大节点并且不是pos的节点为根的子树变成大顶堆 { swap(a[big],a[pos]); Headadjust(a,big,len); }}void build(int *a,int len)//建立初始堆{ for(int i=len/2;i>=1;i--)//len/2为下标最大的非叶子节点 Headadjust(a,i,len); //将其调整为父亲节点最大的情况}void Headsort(int *a,int len){ build(a,len);//建立初始大顶堆 for(int i=len;i>=1;i--) { swap(a[i],a[1]);//依次把最大的元素放到最后一位,那么最后就是有序的序列 Headadjust(a,1,i-1);//调节新的堆,堆顶为最大元素 }}int main(){ int i,j; int a[N]; int n; while(~scanf("%d",&n)) { for(i=1;i<=n;i++) scanf("%d",&a[i]); Headsort(a,n); for(i=1;i<=n;i++) printf("%d ",a[i]); printf("\n"); } return 0;}/*616 7 3 20 17 8*/
1 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- View的简介
- 稀疏图的邻接表
- maven介绍及在eclipse中使用
- Angular用ng-repeat生成表单并绑定ng-click时的一个细节
- unix环境高级编程-unix的进程环境
- 堆排序
- 数字三角形 c 语言实现
- 开源C++项目Google JavaScript引擎V8挑战实录,带你进入V8之旅
- 多边形自相交处理-selfIntersection
- 山东省浪潮杯 SDUT3260大整数取模
- C++中多态性和重载
- Spark配置
- 第二周项目2-别拿胖子说事
- Effective Java——创建和销毁对象