Pagini recente » Cod sursa (job #2490547) | Cod sursa (job #1009579) | Cod sursa (job #1300330) | Cod sursa (job #2323244) | Cod sursa (job #1263182)
#include <stdio.h>
typedef int Heap[1<<19];
inline int father(int node)
{
return node / 2;
}
inline int left_son(int node)
{
return node * 2;
}
inline int right_son(int node)
{
return node * 2 + 1;
}
inline void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void sift(Heap h, int n, int k)
{
int node = 0;
do {
if (left_son(k) <= n) node = left_son(k);
if (right_son(k) <= n && h[right_son(k)] > h[left_son(k)])
node = right_son(k);
if (h[node] <= h[k]) node = 0;
if (node) {
swap(&h[node], &h[k]);
k = node;
}
} while(node);
}
void build_heap(Heap h, int n)
{
int i;
for (i = n / 2; i >= 0; i--) {
sift(h, n, i);
}
}
void heap_sort(Heap h, int n)
{
int i;
build_heap(h, n - 1);
for (i = n - 1; i > 0; i--) {
swap(&h[0], &h[i]);
sift(h, i - 1, 0);
}
}
int main()
{
int n, i;
Heap h;
FILE *fdin = fopen("algsort.in", "r");
FILE *fdout = fopen("algsort.out", "w");
fscanf(fdin, "%d", &n);
for (i = 0; i < n; i++) fscanf(fdin, "%d", &h[i]);
heap_sort(h, n);
for (i = 0; i < n; i++) fprintf(fdout, "%d ", h[i]);
return 0;
}