oregon ha scritto:
Ovviamente. Altrimenti come fa a sapere quanti sono gli elementi esattamente?
E se è un valore costante, mettilo in una define
#define N 10
Okay grazie mille! ora funziona!
Però mi sono bloccato su un'altra cosa. Di sei algoritmi l'unico che non funzione è mergesort. Ecco il codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* dichiarazione delle funzioni */
void mergesort(int a[], int sx, int dx);
/* funzione main */
int main ()
{
int n = 5;
int i;
int array[n];
int array_copia[n];
printf("Ecco l'array da ordinare:\n");
srand(1);
for(i=0;i< n;i++)
{
array[i] = rand() % 40;
printf("%d\n",array[i]);
}
for(i=0;i< n;i++)
{
array_copia[i] = array[i];
}
/* ordina tramite mergesort */
printf("array ordinato tramite mergesort:\n");
for(i=0;i< n;i++)
{
array_copia[i] = array[i];
}
mergesort(array_copia,0,n-1);
for(i=0; i< n; i++)
{
printf("%d\n",array_copia[i]);
}
}
void fondi(int a[], int sx, int mx, int dx)
{
int *b, /* array di appoggio */
i, /* indice per la parte sinistra di a (da sx ad m) */
j, /* indice per la parte destra di a (da m + 1 a dx) */
k; /* indice per la porzione di b da sx a dx */
/* fondi ordinatamente le due parti finche' sono entrambe non vuote */
b = (int *)calloc(dx + 1,sizeof(int));
for (i = sx, j = mx + 1, k = 0; ((i <= mx) && (j <= dx));k++)
if (a[i] <= a[j])
{
b[k] = a[i];
i++;
}
else
{
b[k] = a[j];
j++;
}
while (i <= mx) {
b[k] = a[i];
i++;
k++;
}
while (j<=dx) {
b[k] = a[j];
i++;
k++;
}
for (k=sx; k<=dx; k++)
a[k] = b[k - sx];
free(b);
}
/* Mergesort */
void mergesort(int a[], int sx, int dx)
{
int mx;
if (sx < dx)
{
mx = (sx + dx) / 2;
mergesort(a,sx,mx);
mergesort(a,mx + 1,dx);
fondi(a,sx,mx,dx);
}
}
Quando mando in esecuzione, succede questo:
Ecco l'array da ordinare:
23
6
17
35
33
array ordinato tramite mergesort:
e l'esecuzione non va avanti... Non riesco a trovare l'errore.