Help con "selection-sort" linguaggio c

di il
4 risposte

Help con "selection-sort" linguaggio c

Ho scoperto un buon compilatore ,o almeno credevo, per android ,ovvero, CppDroid.
L'ho voluto mettere alla prova con programmini basilari e ha funzionato, poi ho provato a creare un programma che mette in ordine un array di n elementi scrivendo questo codice:
#include <stdio.h>
int main() {
    int n;
    int a[n];
	int i;
	printf ("quanti posti per il vettore? ");
	scanf ("%d",&n);
	for (i=1; i<n+1; i++) { 
		printf ("inserisci valore al posto %d - ",i);
		scanf ("%d",&a[i]);
	}
	int t=0;
	for (i=1; i<n+1; i++) {
        int temp;
        int j;
        t=t+1;
	    for (j=t; j<n+1; j++) {
            if (temp>a[j]) {
			   temp=a[j];
			   a[j]=a[i];
			   a[i]=temp;
		    }
        }
    temp=1999999999;
    }
	for (i=1; i<n+1; i++) {
		printf ("array ordinato: posto %d = %d\n",i,a[i]);
	}
return main();
}

il codice è corretto in quanto sul pc (con il compilatore dev-c++) il programma funziona correttamente mentre su CddDroid mi da un output di un array che mette in ordine crescente solo le ultime 2 posizioni.
Qualcuno sa dirmi dove sta il problema?
grazie in anticipo buona serata.

4 Risposte

  • Re: Help con "selection-sort" linguaggio c

    Il problema è che quel codice è sbagliato! Innanzitutto gli array sono 0-indexed, cioè gli indici vanno da 0 a N-1 (compreso), dove N indica la dimensione dell'array (in tutti i cicli arrivi fino ad N, che è fuori dall'array).
    Poi quando fai "if (temp>a[j])" ti ritrovi che "temp" non è inizializzata! Poi cosi ad occhio non mi pare proprio che quello sia il codice del selection sort
  • Re: Help con "selection-sort" linguaggio c

    Ho risolto inizializzando temp subito invece che dopo...il codice comunque ti assicuro che è quello di selection sort in quanto attua lo stesso procedimento ,ovvero, confronto e scambio.
    Per quandto riguarda l'array il metodo di indicizzarlo da 1 a n+1 io ho sempre utilizzato questa tecnica sia quando usao visual basic e ora con c e sinceramente mi è sempre funzionato.
    grazie mille per la risposta
  • Re: Help con "selection-sort" linguaggio c

    Il fatto che il codice funzioni anche se gli indici dell'array sono sbagliati non significa che sia giusto. Se esci fuori dagli indici dell'array sporchi della memoria che non appartiene all'array, quindi potresti sovrascrivere il valore di altre variabili oppure causare un "segmentation fault" (--> crash).
    Non so come funzioni per il visual basic, ma in C, Java e in tanti altri linguaggi l'indice dell'array inizia da 0 e finisce al valore N-1 (incluso). Per cui di solito i cicli si fanno in questo modo:
    
    int i;
    for (i=0; i < n; i++) {
       ...
    }
    
    E' vero che l'insertion sort funziona per confronti e scambi, ma la maggior parte degli algoritmi di ordinamento funziona così. Quello che hai implementato tu è un bubble sort:
    #include <stdio.h>
    #include <time.h>
    
    #define LENGTH 10
    
    void print_array(int array[], int n);
    void bubblesort(int array[], int n);
    
    int main()
    {
        int n = LENGTH;
        int array[n];
        
        // init random
        srand(time(NULL));
        
        int i;
        for (i=0; i<n; i++) {
            array[i] = rand()%100; // number in 0-99
        }
        
        printf("Initial array: ");
        print_array(array, n);
        
        bubblesort(array, n);
        
        printf("Ordered array: ");
        print_array(array, n);
    }
    
    void bubblesort(int array[], int n) {
        int i;
        int j;
        
        for (i=0; i<n; i++) {
            for (j=i+1; j<n; j++) {
                if (array[i] > array[j]) {
                    int tmp = array[j];
                    array[j] = array[i];
                    array[i] = tmp;
                }
            }
        }
    }
    
    void print_array(int array[], int n) {
        int i;
        for (i=0; i<n; i++) {
            printf("%d ", array[i]);
        }
        printf("\n");
    }
    
    EDIT: Fra l'altro mi accorgo solo ora della riga "temp = 199999999999999"! A cosa dovrebbe servire? La condizione "if (temp>a[j])" sarà sempre vera (se l'array è composto da numeri ragionevolmente piccoli), quindi lo scambio verrà effettuato sempre, almeno alla prima iterazione del ciclo più innestato
  • Re: Help con "selection-sort" linguaggio c

    Grazie di tutte queste informazioni (anche se mi sa che abbiamo sforato l'argomento del forum "android" ahahah) sono nuovo del "mestiere" e per adesso sono anche autodidatta quindi ahahah
    avevo inizializzato temp con un valore grande cosi che la condizione if fosse sempre valida (sopratutto per quanto riguarda la prima volta che viene eseguito)
Devi accedere o registrarti per scrivere nel forum
4 risposte