Pagini recente » Cod sursa (job #1603740) | Cod sursa (job #2278833) | Cod sursa (job #3207540) | Istoria paginii preoni-2007/clasament/runda-4/11-12 | Cod sursa (job #2287129)
#include<stdio.h>
int fiuDr(int node) {
return 2*node+1;
}
int fiuSt(int node) {
return 2*node;
}
int Schimb(int node1, int node2, int v[]) {
if(v[node1] > v[node2]) {
int aux = v[node2]; v[node2] = v[node1]; v[node1] = aux;
return node1;
}
return node2;
}
void HeapDown(int n, int x, int v[]) {
while((fiuDr(x) <= n && v[fiuDr(x)] > v[x]) || (fiuSt(x) <= n && v[fiuSt(x)] > v[x])) {
if(fiuDr(x) <= n && v[fiuDr(x)] > v[fiuSt(x)]) {
x = Schimb(fiuDr(x), x, v);
} else {
x = Schimb(fiuSt(x), x, v);
}
}
}
void Afisare(FILE *out, int n, int v[]) {
int i;
for(i=1; i<=n; i++) {
fprintf(out, "%d ", v[i]);
}
//fprintf(out, "\n");
}
void Extract(int n, int v[]) {
if(n < 2)
return ;
Schimb(1, n, v);
HeapDown(n-1, 1, v);
}
int main ()
{
FILE *in, *out;
in = fopen("algsort.in", "r");
out = fopen("algsort.out", "w");
int n, i;
fscanf(in, "%d", &n);
int v[n+1];
for(i=1; i<=n; i++) {
fscanf(in, "%d", &v[i]);
}
for(i=n/2; i>0; i--) {
HeapDown(n, i, v);
}
//Afisare(out, n, v);
int m = n;
for(i=1; i<=n; i++) {
Extract(m, v);
m --;
}
Afisare(out, n, v);
return 0;
}