Cod sursa(job #2002904)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 21 iulie 2017 10:40:29
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <vector>
#include <utility>

using namespace std;

int vals[500001];
vector<int> sorted;

int n;


void heap_sus(int p){
    if(p == 1 || p > n)
        return;
    if(vals[p] < vals[p / 2]){
        swap(vals[p], vals[p / 2]);
        heap_sus(p / 2);
    }
}


void heap_jos(int p){
    int new_p = p;
    if(2 * p <= n && vals[p] > vals[2 * p])
        new_p = 2 * p;
    if(2 * p + 1 <= n && vals[2 * p + 1] < vals[new_p])
        new_p = 2 * p + 1;
    if(new_p != p){
        swap(vals[p], vals[new_p]);
        heap_jos(new_p);
    }
}

void sortpart(int v[]){
    while(n > 0){
        swap(v[1], v[n]);
        sorted.push_back(v[n]);
        n--;
        heap_jos(1);
    }
}


int main(){
    FILE *fin, *fout;
    fin = fopen("algsort.in", "r");
    fout = fopen("algsort.out", "w");
    fscanf(fin, "%d", &n);
    sorted.push_back(0);
    for(int i = 1;i <= n;i++){
        fscanf(fin, "%d", &vals[i]);
        heap_sus(i);
    }
    sortpart(vals);
    for(int i = 1;i < int(sorted.size());i++)
        fprintf(fout, "%d ", sorted[i]);
    fprintf(fout, "\n");
    return 0;
}