排序-堆排序

来源:互联网 发布:万网单域名控制台 编辑:程序博客网 时间:2024/06/07 17:28

输入格式:

输入第一行给出正整数N105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。

输出格式:

在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。

输入样例:

114 981 10 -17 0 -20 29 50 8 43 -5

输出样例:

-20 -17 -5 0 4 8 10 29 43 50 981
#include <bits/stdc++.h>void HeapAdjust(int a[], int s, int m){    a[0] = a[s];    for(int i = 2 * s; i <= m; i *= 2)    {        if(i < m && a[i] < a[i + 1])            ++i;        if(a[i] <= a[0]) break;        else        {            a[s] = a[i];            s  = i;        }    }    a[s] = a[0];}int main(){    int N;    int a[100010];    scanf("%d", &N);    for(int i = 1; i <= N; ++i)        scanf("%d", &a[i]);    //初始化最大堆    for(int i = N / 2; i > 0; --i)        HeapAdjust(a, i, N);    for(int i = N; i > 0; --i)    {        a[0] = a[1];        a[1] = a[i];        a[i] = a[0];        HeapAdjust(a, 1, i - 1);    }    printf("%d", a[1]);    for(int i = 2; i <= N; ++i)        printf(" %d", a[i]);}

原创粉丝点击