Pagini recente » Cod sursa (job #3250798) | Cod sursa (job #1014248) | Cod sursa (job #1830393) | Cod sursa (job #527265) | Cod sursa (job #2293254)
#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;
}