Domanda ordinamento

alessina02

Utente Bronze
2 Gennaio 2022
35
11
0
25
Salve,
avrei bisogno di implementare una funzione che abbia in input quattro numeri qualsiasi e che ritorni un vettore contenente i valori in ordine crescente. Avevo pensato di strutturarla come una specie di selection sort, ma sto avendo dei problemi e secondo me non è la strada migliore.
 
Codice:
void scambia (int a, int b){
    int aux;
    aux=a;
    a=b;
    b=aux;
    return;}


int ordina (int h, int m, int l, int k)
{int b[4], i;
b[0]=h; b[1]=m; b[2]=l; b[3]=k;
    for (i=0; i<4; i++){
    if (b[i]>b[i+1]) scambia (b[i], b[i+1]);}
return b;
}
 
Codice:
void scambia (int a, int b){
    int aux;
    aux=a;
    a=b;
    b=aux;
    return;}


int ordina (int h, int m, int l, int k)
{int b[4], i;
b[0]=h; b[1]=m; b[2]=l; b[3]=k;
    for (i=0; i<4; i++){
    if (b[i]>b[i+1]) scambia (b[i], b[i+1]);}
return b;
}
A occhio non mi sembra corretto, tutt'altro.

La funzione scambia riceve 3 interi e tutti sono passati per valore, quindi lo scambio non avviene. Inoltre il "return" è inutile.

Inoltre, un solo for non è sufficiente: 3,4,1,2 restituirebbe come output 3,1,2,4.

E l'altro errore è l'out of bounds dell'array. Quando i=3 si verifica l'accesso alla locazione 4 dell'array, che non è allocata, andando a leggere la locazione di memoria successiva.

La cosa più semplice visto che hai 4 elementi (e poco importano le prestazioni) è BubbleSort.
 
Ciao, se mi posso permettere di darti qualche consiglio

1) Utilizza il bb sort, è molto più efficiente e rapido, guarda qui:
1702210055167.png


Questa è una comparazione tra ricerche e ordinamenti in base al numero di elemento.
Ti invito a fare la comparazione tra i due "modi", bubble sort e ripple sort (selection sort).

Inoltre per renderti la vita facile, perchè non utilizzi un vettore?
Inoltre ti invito sempre a controllare se i valori inseriti sono già ordinati, sennò sprecheresti istruzioni...


Il ripple sort funziona banalmente trovando il minimo tra i numeri e inserendolo come primo, trovando il 2' numero minimo inserendolo come secondo..

Ecco qui una implementazione che ho fatto l'anno scorso a scuola.

C++:
void ordinamento_ripple_sort(float vettore[],int n)
{
    int minimo;
    for (int i = 0; i < n-1; i++)
    {
        minimo = i;
        for (int j = i+1; j < n; j++)
        {
            if (vettore[j] < vettore[minimo])
            {
                minimo = j;
            }
        }
        if (minimo!=i)
        {
            scambio(vettore[minimo], vettore[i]);
        }
    }
}


Un'altra cosa, la funzione scambia deve passare per riferimento, non per valore...
Tu devi scambiare le "copie originali", per questo!
Messaggio unito automaticamente:

int ordina (int h, int m, int l, int k) {int b[4], i; b[0]=h; b[1]=m; b[2]=l; b[3]=k; for (i=0; i<4; i++){ if (b>b[i+1]) scambia (b, b[i+1]);} return b; }
ma non avevi detto di utilizzare un algoritmo di tipo selection sort? questo è bubble sort...
 
Ciao, se mi posso permettere di darti qualche consiglio

1) Utilizza il bb sort, è molto più efficiente e rapido, guarda qui:
Visualizza allegato 72719

Questa è una comparazione tra ricerche e ordinamenti in base al numero di elemento.
Ti invito a fare la comparazione tra i due "modi", bubble sort e ripple sort (selection sort).

Inoltre per renderti la vita facile, perchè non utilizzi un vettore?
Inoltre ti invito sempre a controllare se i valori inseriti sono già ordinati, sennò sprecheresti istruzioni...


Il ripple sort funziona banalmente trovando il minimo tra i numeri e inserendolo come primo, trovando il 2' numero minimo inserendolo come secondo..

Ecco qui una implementazione che ho fatto l'anno scorso a scuola.

C++:
void ordinamento_ripple_sort(float vettore[],int n)
{
    int minimo;
    for (int i = 0; i < n-1; i++)
    {
        minimo = i;
        for (int j = i+1; j < n; j++)
        {
            if (vettore[j] < vettore[minimo])
            {
                minimo = j;
            }
        }
        if (minimo!=i)
        {
            scambio(vettore[minimo], vettore[i]);
        }
    }
}


Un'altra cosa, la funzione scambia deve passare per riferimento, non per valore...
Tu devi scambiare le "copie originali", per questo!
Messaggio unito automaticamente:


ma non avevi detto di utilizzare un algoritmo di tipo selection sort? questo è bubble sort...

Non è nemmeno bubble sort quello, ci assomiglia.