Cod sursa(job #2383718)

Utilizator AplayLazar Laurentiu Aplay Data 19 martie 2019 19:12:14
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <stdio.h>

#define N_MAX 1000001

int N, n[N_MAX];

void _swap(int& first, int& second) {
    int temp = first;
    first = second;
    second = temp;
}

int _left(int position) {
    return 2 * position + 1;
}

int _right(int position) {
    return 2 * position + 2;
}

void _down(int* heap, int size, int from) {
    do {
        int swapWith = -1;
        int left = _left(from);
        if (left < size && heap[from] < heap[left]) {
            swapWith = left;
        }
        int right = _right(from);
        if (right < size && heap[from] < heap[right] && heap[left] < heap[right]) {
            swapWith = right;
        }
        if (-1 == swapWith) break;
        _swap(heap[from], heap[swapWith]);
        from = swapWith;
    } while(true);
}

void _heapify(int* heap, int size) {
    for (int position = size / 2 - 1; 0 <= position; --position) {
        _down(heap, size, position);
    }
}

int main() {
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    scanf("%d", &N);
    for (int it = 0; it < N; ++it) {
        scanf("%d", &n[it]);
    }
    
    _heapify(n, N);
    
    int sizeLeft = N;
    while (1 < sizeLeft) {
        _swap(n[0], n[sizeLeft - 1]);
        --sizeLeft;
        _down(n, sizeLeft, 0);
    }
    
    for (int it = 0; it < N; ++it) printf("%d ", n[it]);
    printf("\n");

    return 0;
}