Cod sursa(job #2293254)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 30 noiembrie 2018 18:10:33
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <stdio.h>

using namespace std;

void interschimba(int &a, int &b) {
    int aux = a;
    a = b;
    b = aux;
}

void sus(int &pos, int *heap) {
    while (pos > 1 && heap[pos] < heap[pos / 2]) {
        interschimba(heap[pos], heap[pos / 2]);
        pos = pos / 2;
    }
}

void jos(int pos, int *heap, int dim_heap) {
    while (true) {
        // daca nu are fii inseamna ca e pe pozitia corecta (avand in vedere ca valoarea de unde a venit era mai mica)
        if (pos * 2 > dim_heap)
            return;
        if (pos * 2 == dim_heap) { // are doar un fiu
            if (heap[pos] > heap[pos * 2]) {
                interschimba(heap[pos], heap[pos * 2]);
                pos *= 2;
            }
            else
                return;
        }
        else { // daca a ajuns pana aici inseamna ca are 2 fii
            int min_fiu_pos = pos * 2; // presupunem ca fiul stang e mai mic
            if (heap[pos * 2] > heap[pos * 2 + 1])
                min_fiu_pos++;  // al doilea fiu este cel cu care trebuie sa schimbam (min_fiu_pos++ echivalent cu min_fiu_pos = pos * 2 + 1)
            if (heap[pos] > heap[min_fiu_pos]) {
                interschimba(heap[pos], heap[min_fiu_pos]);
                pos = min_fiu_pos;
            }
            else
                return;
        }
    }
}

// transforma vectorul intr-un vector "heap" tragand fiecare element in jos
void heapify(int *heap, int dim_heap) {
    int start = dim_heap / 2;
    while (start > 0) {
        jos(start, heap, dim_heap);
        start--;
    }
}

void insert_heap(int valoare, int *heap, int &dim_heap) {
    // inseram valoarea pe ultima pozitie, apoi urcam in sus pana gasim pozitia corecta
    dim_heap++;
    heap[dim_heap] = valoare;
    int poz_start = dim_heap;
    sus(poz_start, heap);
}

int main() {
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);
	int n;
	scanf("%d", &n);
	int v[500001];
	for (int i = 1; i <= n; i++)
        scanf("%d", &v[i]);
    heapify(v, n);
    for (int i = 2; i <= n; i++) {
        printf("%i ", v[1]);
        interschimba(v[1], v[n - i + 2]);
        jos(1, v, n - i + 1);
    }
    printf("%i ", v[1]);
	return 0;
}