Ordinamento array

di il
5 risposte

Ordinamento array

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

  • Re: Ordinamento array

    Queste
    
    	int array[n];
    	int array_cop
    
    non hanno senso prima di assegnare un valore a n
  • Re: Ordinamento array

    Quindi metto n=10 prima della dichiarazione degli array?
  • Re: Ordinamento array

    Ovviamente. Altrimenti come fa a sapere quanti sono gli elementi esattamente?

    E se è un valore costante, mettilo in una define

    #define N 10
  • Re: Ordinamento array

    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.
  • Re: Ordinamento array

    Dai un'occhiata a questo codice

    https://www.geeksforgeeks.org/merge-sort

    il problema è nella funzione fondi (che nell'articolo viene chiamata merge)
Devi accedere o registrarti per scrivere nel forum
5 risposte