#include <stdio.h>
//#include <stdlib.h>
//#include <time.h>
#define LEFT(i) (2*(i))
#define RIGHT(i) (2*(i) + 1)
int a[500001], n;
int ASG, CMP;
//Tests if a vector is sorted.
void valid(int n, int a[]){
int i;
for(i = 1; i < n; i++)
if(a[i] > a[i+1]){
printf("*****ERROR!!!*****");
break;
}
}
void gen_avg(int n, int a[]){
FILE *f = fopen("avg.dat", "a");
int i;
fprintf(f, "%d ", n);
for(i = 1; i <= n; ++i){
a[i] = rand() % 10000;
//fprintf(f, "%d ", a[i]);
}
fprintf(f, "\n");
fclose(f);
}
void max_heapify(int a[], int i, int n){
int aux,largest, l, r;
largest = i;
do{
CMP++;
i = largest;
l = LEFT(i);
r = RIGHT(i);
if(l <= n && a[i] < a[l])
largest = l;
CMP++;
if(r <= n && a[largest] < a[r])
largest = r;
if(largest != i){
aux = a[i];
a[i] = a[largest];
a[largest] = aux;
ASG += 3;
}
} while (i!=largest);
}
void build_max_heap(int a[], int n){
int i;
for(i = n/2; i >= 1; i--)
max_heapify(a, i, n);
}
void heapsort(int a[], int n){
int aux, i;
build_max_heap(a, n);
for(i = n; i >= 2; i--){
aux = a[i];
a[i] = a[1];
a[1] = aux;
ASG+=3;
max_heapify(a, 1, i-1);
}
}
int main(){
int aux, i, M;
FILE *f = fopen("algosrt.in", "r");
FILE *g = fopen("algosrt.out", "w");
fscanf(f, "%d", &n);
for(i = 1; i <= n; ++i)
fscanf(f, "%d", &a[i]);
heapsort(a, n);
for(i = 1; i <= n; ++i)
fprintf(g, "%d ", a[i]);
fclose(f);
fclose(g);
/*
FILE *f = fopen("heapsort.csv", "w");
srand(time(NULL));
for(M = 100; M <= 100000; M+=300){
gen_avg(M, a);
n = M;
CMP = ASG = 0;
heapsort(a, n);
valid(n, a);
fprintf(f, "%d, %d, %d, %d\n", n, ASG + CMP, ASG, CMP);
}
fclose(f);
*/
return 0;
}