Cod sursa(job #2257988)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 10 octombrie 2018 18:28:23
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#define swap(a, b) {unsigned aux; aux=a; a=b; b=aux;}
#define min(a, b) (a<b?a:b)
#define max(a, b) (a>b?a:b)
#define MaxN 500005
using namespace std;
unsigned Inf, N, i, j, List[MaxN], Copy;
void Sift(unsigned i);
int main()
{
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);
    scanf("%d", &N);
    for(i=1; i<=N; ++i){
        scanf("%d", &List[i]);
        Inf=max(Inf, List[i]);}
    ++Inf;
    for(i=N/2; i>=1; --i) Sift(i);
    Copy=N;
    for(i=1; i<Copy; ++i){
        printf("%u ", List[1]);
        List[1]=Inf;
        Sift(1);
    }
    printf("%d", List[1]);
    return 0;
}
void Sift(unsigned i){
    bool k=1;
    while(i*2<=N && k){
        k=0;
        if(i*2==N && List[i*2]<List[i]){
            swap(List[i*2], List[i]);
            i*=2;
            k=1;
        }
        else if(i*2+1<=N && (List[i*2]<List[i] || List[i*2+1]<List[i])){
            unsigned a=(List[i*2]<List[i*2+1]?i*2:i*2+1);
            swap(List[i], List[a]);
            i=a;
            k=1;
        }
    }
    return;
}