堆排序

来源:互联网 发布: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
原创粉丝点击