Pagini recente » Cod sursa (job #3126536) | Cod sursa (job #3286275) | Cod sursa (job #2873074) | Cod sursa (job #492432) | Cod sursa (job #1525443)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 500001
int Heap[NMAX];
int N;
int father(int node) {
return node/2;
}
int left_child(int node) {
return node<<1;
}
int right_child(int node) {
return 2 * node + 1;
}
void swap(int *x, int *y) {
int aux;
aux = *x;
*x = *y;
*y = aux;
}
void goDown(int Heap[NMAX], int N, int K) {
int child;
do {
child = 0;
if(left_child(K) <= N) {
child = left_child(K);
if(right_child(K) <= N && Heap[right_child(K)] > Heap[child]) {
child = right_child(K);
}
if(Heap[K] >= Heap[child]) {
child = 0;
}
}
if(child) {
swap(&Heap[child], &Heap[father(child)]);
K = child;
}
} while(child);
}
void buildHeap(int Heap[NMAX], int N) {
for(int nodes = N / 2; nodes > 0; --nodes)
goDown(Heap, N, nodes);
}
void reads() {
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
scanf("%d", &N);
for(int i = 1; i <= N; ++i)
scanf("%d", &Heap[i]);
}
void sortHeap(int Heap[NMAX], int N) {
for(int i = N; i > 1; --i) {
swap(&Heap[1], &Heap[i]);
goDown(Heap, i - 1, 1);
}
}
int main(void) {
reads();
buildHeap(Heap, N);
sortHeap(Heap, N);
for(int i = 1; i <= N; ++i)
printf("%d ", Heap[i]);
return 0;
}