Capire il selection sort in C

di il
21 risposte

Capire il selection sort in C

Ciao, sto seguendo lo studio del C tramite un libro dove ci sono codici da imparare (per i nabbi)
tuttavia ogni capita che il libro non descrive accuratamente alcuni passaggi e mi ritrovo a fondere il cervello per capire.
Vi rimando qui una parte di codice che non riesco ad interpretare in maniera semplice come con le precedenti 150 pagine...
#include <stdio.h>
#include <stdlib.h>
#define N 5

int main(int argc, char *argv[])
{
    int a[N] = {9, 5, 1, 3, 2};
    int i, j, temp;

    for (i=0; i<=N - 2; i++)
    {
       for(j=i+1; j<=N -1; j++)
        printf("\t");
     }

    printf("%d", i);
    printf("\n");
    system("PAUSE");
    return 0;
}
il codice descritto nel libro l' ho tagliato nelle parti che non capisco per migliorare la concezione dei miei dubbi:

ad esempio vorrei sapere perchè se N è definito come costante con valore 5 e nel primo INT parte il conto da ZERO essendo un array, ma nel primo ciclo for (con indice i) mi viene stampato il risultato 4.
Quindi suppongo che nel primo ciclo N sarebbe un 6 perchè viene sottratto di 2, mentre se nel printf metto l' indice j al posto di i mi stampa un 5 come se nel secondo ciclo la N corrispondesse sempre ad un 6.

il problema è che non può essere lo stesso numero 6 visto che nel primo ciclo parte da 0 e nel secondo parte da 1!

Com'è possibile ciò?
Altra domanda:
se il primo indice i parte contando da 0, il numero 5 non corrisponderebbe all' ultimo numero dell'array, quindi 2?

21 Risposte

  • Re: Capire il selection sort in C

    Ciao, intanto vediamo se hai capito il funzionamento del Selectionsort, fai una breve spiegazione di come dovrebbe comportarsi questo algoritmo.
  • Re: Capire il selection sort in C

    Il compilatore fa un primo giro con il preprocessore prima di compilare. Quindi partendo da
    
    #include <stdio.h>
    #include <stdlib.h>
    #define N 5
    
    int main(int argc, char *argv[])
    {
        int a[N] = {9, 5, 1, 3, 2};
        int i, j, temp;
    
        for (i=0; i<=N - 2; i++)
        {
           for(j=i+1; j<=N -1; j++)
            printf("\t");
         }
    
        printf("%d", i);
        printf("\n");
        system("PAUSE");
        return 0;
    }
    
    Sostituisce N con 5 e compilerà questo codice
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        int a[5] = {9, 5, 1, 3, 2};
        int i, j, temp;
    
        for (i=0; i<=5 - 2; i++)
        {
           for(j=i+1; j<=5 -1; j++)
            printf("\t");
         }
    
        printf("%d", i);
        printf("\n");
        system("PAUSE");
        return 0;
    }
    
    Per il resto il codice non fa nulla di rilevante in termini di ordinamento. Stai stampando una serie di TAB, poi quando esci dai for stampi la variabile i che ovviamente avrà il primo valore che non soddisfa la condizione del primo for, cioè 4
  • Re: Capire il selection sort in C

    Ma dove sta il codice dell'ordinamento?
  • Re: Capire il selection sort in C

    Weierstrass ha scritto:


    Il compilatore fa un primo giro con il preprocessore prima di compilare. Quindi partendo da
    
    #include <stdio.h>
    #include <stdlib.h>
    #define N 5
    
    int main(int argc, char *argv[])
    {
        int a[N] = {9, 5, 1, 3, 2};
        int i, j, temp;
    
        for (i=0; i<=N - 2; i++)
        {
           for(j=i+1; j<=N -1; j++)
            printf("\t");
         }
    
        printf("%d", i);
        printf("\n");
        system("PAUSE");
        return 0;
    }
    
    Sostituisce N con 5 e compilerà questo codice
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        int a[5] = {9, 5, 1, 3, 2};
        int i, j, temp;
    
        for (i=0; i<=5 - 2; i++)
        {
           for(j=i+1; j<=5 -1; j++)
            printf("\t");
         }
    
        printf("%d", i);
        printf("\n");
        system("PAUSE");
        return 0;
    }
    
    Per il resto il codice non fa nulla di rilevante in termini di ordinamento. Stai stampando una serie di TAB, poi quando esci dai for stampi la variabile i che ovviamente avrà il primo valore che non soddisfa la condizione del primo for, cioè 4
    In che senso non soddisfa la condizione del "for"? Non essendo un If nè un Else non credevo avesse delle "condizioni da soddisfare" (perdonate l' ignoranza)

    poi, se N = 5 perchè N-2 mi da 4 ed N-1 mi da 5?
  • Re: Capire il selection sort in C

    orion99 ha scritto:


    Ciao, intanto vediamo se hai capito il funzionamento del Selectionsort, fai una breve spiegazione di come dovrebbe comportarsi questo algoritmo.
    Non l' ho ancora capito.
    sto facendo il primo esercizio del libro a riguardo.
  • Re: Capire il selection sort in C

    
    for (i=0; i <= 5 - 2; i++)  {
    	[...]
    }
    vuol dire
    
    i = 0;
    while(i <= 3)  {
    	[...]
    	i = i + 1;
    }
    Ovviamente quando i = 4 sei fuori dal ciclo. Non mi pare ci sia molto altro da dire, se non che forse è il caso di ripassare un attimo queste 150 pagine già fatte...
  • Re: Capire il selection sort in C

    Weierstrass ha scritto:


    
    for (i=0; i <= 5 - 2; i++)  {
    	[...]
    }
    vuol dire
    
    i = 0;
    while(i <= 3)  {
    	[...]
    	i = i + 1;
    }
    Ovviamente quando i = 4 sei fuori dal ciclo. Non mi pare ci sia molto altro da dire, se non che forse è il caso di ripassare un attimo queste 150 pagine già fatte...
    si ok, tu mi hai scritto un' equivalenza del codice, ma questo non risponde a nessuno dei miei dubbi.
    Ribadisco, se N è uguale a 5, e 5 meno 2 ho sempre saputo che facesse 3, perchè nel print("%d", i) mi da 4 e non 3?
    Stessa cosa me la ritrovo nella variante j che con N meno 1 mi da risultato stampato 5 e non 4. Una volta che avrò capito questo potrò andare avanti
  • Re: Capire il selection sort in C

    Perché la condizione i <= 3 è ancora valida, quindi esegue ancora una iterazione, pertanto i viene incrementato di 1 e assume il valore 4, quindi il ciclo termina.
  • Re: Capire il selection sort in C

    Andrea Quaglia ha scritto:


    Perché la condizione i <= 3 è ancora valida, quindi esegue ancora una iterazione, pertanto i viene incrementato di 1 e assume il valore 4, quindi il ciclo termina.
    quindi l' iterazione che intendi sarebbe semplicemente la i++ (ovvero i+1)?
  • Re: Capire il selection sort in C

    Dovresti rivedere il funzionamento del for nel tuo libro. È su questo che hai dei dubbi che non ti consentono di proseguire.

    COME funziona un ciclo for?
    NEL ciclo i che valori assume?
    Quanto vale i SOLO all'uscita del for?
  • Re: Capire il selection sort in C

    Non l' ho ancora capito.
    sto facendo il primo esercizio del libro a riguardo.
    Prima di implementare il codice assicurati di aver capito il funzionamento a livello teorico, solo dopo puoi scrivere il codice
  • Re: Capire il selection sort in C

    Beh allora se da una parte faccio fatica a capire alcune logiche nel procedimento, dall' altra parte studio un libro che, con buona probabilità, non è del tutto adatto a neofiti. Alla luce di questo mi servirà trovare una persona che mi insegni a distanza più che un libro dove quello è e quello rimane.
  • Re: Capire il selection sort in C

    Una persona con cui studiare a distanza (collega o docente) è sicuramente consigliabile a prescindere.

    Se vuoi però usare il forum per avere consigli, penso dovresti provare a seguirli. Ti avevo detto di rivedere il funzionamento del ciclo for, cosa che puoi fare da solo e con il libro. Non pensare di avere tutto chiaro perché è proprio lì che ti perdi per ora.
  • Re: Capire il selection sort in C

    oregon ha scritto:


    Una persona con cui studiare a distanza (collega o docente) è sicuramente consigliabile a prescindere.

    Se vuoi però usare il forum per avere consigli, penso dovresti provare a seguirli. Ti avevo detto di rivedere il funzionamento del ciclo for, cosa che puoi fare da solo e con il libro. Non pensare di avere tutto chiaro perché è proprio lì che ti perdi per ora.
    il fatto è che penso di sapere come si sviluppi ciclo FOR, il problema mia è che non capisco come funzioni il ciclo FOR quando è collegato all' ARRAY

    cioè alla fine un ciclo viene indicato con un inizio (i=0) una fine (i <= 7) e il ciclo vero e proprio (i++ o i+1) non penso ci sia altro.
    ma quando questa funzione viene collegata ad un array inizio a non capire bene la logica.

    però in un array bidimensionale il ciclo può essere usato per stampare i settori di righe e colonne
Devi accedere o registrarti per scrivere nel forum
21 risposte