Cod sursa(job #1978304)

Utilizator MaligMamaliga cu smantana Malig Data 7 mai 2017 13:32:30
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

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

#define pb push_back
#define ll long long
const int NMax = 5e5 + 5;
const int inf = 1e9 + 5;

int N;
int v[NMax];

void sift(int*,int,int);
void buildHeap(int*,int);
void heapsort(int*,int);

int main() {
    in>>N;

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

    heapsort(v,N);


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

    in.close();out.close();
    return 0;
}

void heapsort(int* heap,int N) {
    buildHeap(heap,N);

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

void buildHeap(int* heap,int N) {

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

void sift(int* heap,int node,int N) {
    int son = 0;
    do {
        int fs = 2*node,
            ss = 2*node + 1;

        if (fs <= N) {
            son = fs;

            if (ss <= N && heap[ss] > heap[son]) {
                son = ss;
            }
        }

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