Ordinamento array

di Frank2000 il
5 risposte
Salve a tutti.
Sto implementando un programmino C nel quale utilizzo un array generato con numeri casuali e lo ordino tramite varie funzioni ognuna delle quali descrive un algoritmo di ordinamento. Utilizzo un array "copia", nel quale appunto copio il mio array, visto che lo devo ogni volta ordinare richiamando una delle funzioni, e se fosse già ordinato non avrebbe senso. Solo che l'esecuzione non mi mostra l'array ordinato, e non riesco a capire il perchè, aiutatemi per favore.
FUNZIONE MAIN:

int main ()
{

int i,n;
int array[n];
int array_copia[n];

n = 10;


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 insertsort */

printf("array ordinato tramite insertsort:\n");

insertsort(array_copia[n],n);
for(i=0; i< n; i++)
   {
      printf("%d\n",array_copia[i]);
   }

FUNZIONE INSERTSORT

void insertsort(int a[],
		int n)
{
	int valore_ins,
	    i,
	    j;
	
	for (i = 1;
	    (i < n);
	    i++)
	{
	    for (valore_ins = a[i], j = i - 1;
	        ((j >= 0) && (a[j] > valore_ins));
		j--)
		a[j + 1] = a[j];
	    if (j + 1 != i)
               a[j + 1] = valore_ins;
	}
}
Quando mando in esecuzione il programma succede questo :

Ecco l'array da ordinare:
23
6
17
35
33
15
26
12
9
21
array ordinato tramite insertsort:
Errore di segmentazione (core dump creato)
Grazie.

5 Risposte

  • Queste
    
    	int array[n];
    	int array_cop
    
    non hanno senso prima di assegnare un valore a n
  • Quindi metto n=10 prima della dichiarazione degli array?
  • Ovviamente. Altrimenti come fa a sapere quanti sono gli elementi esattamente?

    E se è un valore costante, mettilo in una define

    #define N 10
  • 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.
Devi accedere o registrarti per scrivere nel forum
5 risposte