堆排序模板

#include <cstdio>
#include <iostream>
using namespace std;
#define N 1000001
int a[N],n;
void headjust(int i,int size)
{
    int left = i * 2,right = left + 1;
    int max = i;
    if(i <= size / 2)
    {
        if(left <= size && a[left] > a[max])
        max = left;
        if(right <= size && a[right] > a[max])
        max = right;
        if(max != i)
        {
            swap(a[i],a[max]);
            headjust(max,size);
        }

    }
}
void build(int size)
{
    for(int i = size/2;i >= 1;i --)
    headjust(i,size);
}
void headsort(int size)
{
    build(size);//初始化
堆//    for(int i = 1;i <= n;i ++)
//    printf("%d ",a[i]);
//    printf("\n");
    int len = size;
    while(len > 1)
    {
        swap(a[1],a[len]);
        len --;
        headjust(1,len);
//调整堆     }
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i = 1;i <= n;i ++)
        scanf("%d",&a[i]);
        headsort(n);
        //int en = n - k;
        printf("%d",a[n]);
        for(int i = n - 1;i > en;i --)
        printf(" %d",a[i]);
        puts("");
    }
    return 0;
}

  

posted @ 2013-07-23 15:12  fly_lovelove  阅读(199)  评论(0)    收藏  举报