Pagini recente » Cod sursa (job #2932538) | Cod sursa (job #479460) | Cod sursa (job #2243894) | Cod sursa (job #1616300) | Cod sursa (job #283310)
Cod sursa(job #283310)
#include <stdio.h>
int n, heap_size;
int *sir, *heap, *poz;
void read();
void sort();
void write();
void move_up(int);
void move_down(int);
inline void swap(int&, int&);
int main()
{
read();
sort();
write();
return 0;
}
void move_down(int tata)
{
int fiu, h_tata = heap[tata];
for (fiu = tata * 2; fiu <= heap_size; fiu *= 2)
{
if (fiu < heap_size)
{
if (sir[heap[fiu+1]] > sir[heap[fiu]])
{
++fiu;
}
}
if (sir[h_tata] >= sir[heap[fiu]])
{
break;
}
heap[fiu/2] = heap[fiu];
poz[heap[fiu/2]] = fiu / 2;
}
fiu /= 2;
heap[fiu] = h_tata;
poz[heap[fiu]] = fiu;
}
void sort()
{
int i;
// int j;
heap_size = n;
/* printf ("sirul initial:");
for (j = 1; j <= n; ++j)
{
printf (" %d", sir[heap[j]]);
}
*/ for (i = n / 2; i >= 1; --i)
{
// printf ("\n\nmove_down(%d)\n", i);
move_down(i);
/* for (j = 1; j <= n; ++j)
{
printf (" %d", sir[heap[j]]);
}
*/ }
/* printf ("\nheapul initial:");
for (i = 1; i <= n; ++i)
{
printf (" %d", sir[heap[i]]);
}
*/ swap(heap[1], heap[heap_size]);
for (heap_size = n - 1; heap_size >= 1; --heap_size)
{
poz[heap[1]] = 1;
move_down(1);
swap(heap[1], heap[heap_size]);
}
}
void read()
{
int i;
FILE *fin = fopen ("algsort.in", "r");
fscanf (fin, "%d", &n);
sir = new int[n+1];
heap = new int[n+1];
poz = new int[n+1];
for (i = 1; i <= n; ++i)
{
fscanf (fin, "%d", &sir[i]);
heap[i] = i;
poz[i] = i;
}
fclose (fin);
}
void write()
{
int i;
FILE *fout = fopen ("algsort.out", "w");
for (i = 1; i <= n; ++i)
{
fprintf (fout, "%d ", sir[heap[i]]);
}
fprintf (fout, "\n");
fclose (fout);
}
inline void swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
}