Cod sursa(job #2247588)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 28 septembrie 2018 20:19:24
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#define MaxN 500005
#define swap(a, b) {int aux=a; a=b; b=aux;}
using namespace std;
int N, Heap[MaxN], i, vf;
void Percolate(int i);
void Sift(int i);
int main()
{
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);
    scanf("%d", &N); vf=N;
    for(i=1; i<=N; ++i) {scanf("%d", &Heap[i]); Percolate(i);}
    for(i=1; i<=N; ++i){
        printf("%d ", Heap[1]);
        Heap[1]=Heap[vf];
        --vf;
        Sift(1);
    }
    return 0;
}
void Percolate(int i){
    while(i>=2 && Heap[i]<Heap[i/2]){
        swap(Heap[i], Heap[i/2]);
        i/=2;
    }
    return;
}
void Sift(int i){
    while((i*2<=vf && Heap[i]>Heap[i*2]) || (i*2+1<=vf && Heap[i]>Heap[i*2+1])){
        int a;
        if(Heap[i*2]<Heap[i*2+1])a=i*2;
        else a=i*2+1;
        swap(Heap[i], Heap[a]);
        i=a;
    }
    return;
}