Pagini recente » Cod sursa (job #2921509) | Cod sursa (job #1043486) | Cod sursa (job #747496) | Cod sursa (job #747273) | Cod sursa (job #323269)
Cod sursa(job #323269)
#include<stdio.h>
#include<stdlib.h>
#define MINIM 666794
typedef struct heap
{
int *values;
int dim;
int cap;
} hvect, *HVect;
HVect CreateVect ( int *values, int dim, int cap )
{
int i;
HVect H = (HVect)calloc(1, sizeof(hvect));
H->dim = dim;
H->cap = cap;
H->values = (int*)calloc(dim+1, sizeof(int) );
for(i = 1; i <= H->dim; i++)
H->values[i] = values[i-1];
return H;
}
void FreeVect( HVect H )
{
free(H->values);
free(H);
}
void DFilterR ( HVect H, int poz )
{
int left = 2*poz;
int right = 2*poz+1;
int minim = MINIM;
if ( left <= H->dim && H->values[left] < H->values[poz] )
minim = left;
else minim = poz;
if ( right <= H->dim && H->values[right] < H->values[minim] )
minim = right;
if ( minim != poz)
{
int aux = H->values[poz];
H->values[poz] = H->values[minim];
H->values[minim] = aux;
DFilterR( H, minim );
}
}
int ExtractMin ( HVect H )
{
int aux = H->values[1];
H->values[1] = H->values[H->dim];
H->dim--;
DFilterR( H, 1);
return aux;
}
void CreateHeap ( HVect H)
{
int i;
for( i = H->dim/2; i >= 1; i--)
DFilterR (H, i);
}
void Print (HVect H)
{
int i;
for(i = 1 ; i <= H->dim ; i++ )
printf("%d ", H->values[i]);
printf("\n");
}
void HeapSort(int *A, int n)
{
HVect H = CreateVect(A, n, n);
CreateHeap(H);
int *V = (int*)calloc(n, sizeof(int));
int i;
for(i = 0 ; i < n; i++)
*(V+i) = ExtractMin(H);
for(i = 0 ; i < n ; i++)
printf("%d ", *(V+i));
printf("\n");
free(V);
FreeVect(H);
}
int main(void)
{
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
int n, i, *A;
scanf("%d", &n);
A = (int*)calloc(n, sizeof(int));
for (i = 0; i < n ; i++)
scanf("%d", (A+i));
HeapSort(A, n);
free (A);
return 0;
}