Pagini recente » Cod sursa (job #1530383) | Cod sursa (job #1236908) | Cod sursa (job #108208) | Cod sursa (job #865230) | Cod sursa (job #2383718)
#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;
}