Cod sursa(job #2079514)

Utilizator MaligMamaliga cu smantana Malig Data 1 decembrie 2017 14:47:36
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <iomanip>
#include <stack>

#if 1
#define pv(x) cout<<#x<<" = "<<x<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif

using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");

#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
const int NMax = 1e6 + 5;
const ll inf = 1e18 + 5;

int N;
int v[NMax];

void sift(int,int);

int main() {
    in>>N;
    for (int i=1;i <= N;++i) {
        in>>v[i];
    }

    for (int i=N/2;i > 0;--i) {
        sift(i,N);
    }

    for (int i=N;i > 0;--i) {
        swap(v[1],v[i]);
        sift(1,i-1);
    }

    for (int i=1;i <= N;++i) {
        out<<v[i]<<' ';
    }

    return 0;
}

void sift(int node,int lim) {
    int son = 0;
    do {
        son = 0;
        int fs = node<<1, ss = fs + 1;
        if (fs <= lim) {
            son = fs;
            if (ss <= lim && v[ss] > v[fs]) {
                son = ss;
            }
        }

        if (son && v[son] > v[node]) {
            swap(v[node],v[son]);
            node = son;
        }
        else {
            son = 0;
        }
    }
    while (son != 0);
}