[DOMANDA] C Bubble Sort Per Riferimento

Robert T.

Utente Attivo
Penso che tutti in questa sezione conosciate il bubble sort, con ciò voglio affrontare un problema che mi assilla, voglio levarmelo dalla testa.

In c per quello che so un vettore completo è chiamato automaticamente per riferimento, ma i singoli elementi di esso vengono passati per valore.

CODICE
Codice:
#include <stdio.h>

#define SIZE 10

void bubbleSort(int * const array, const int size);

int main(){

    int a[SIZE] = {2,4,6,2,5,6,7,49,1};

    int i; // contatore

    printf("Ordine originale");

    for (int j = 0; j < SIZE; ++j) {
        printf("%d\n", a[j]);
    }

    bubbleSort(a, SIZE);

    printf("riordinati");

    for (int j = 0; j < SIZE; ++j) {
        printf("%d\n", a[j]);
    }

    return 0;
}

void bubbleSort(int * const array, const int size){
    void swap(int *element1Ptr, int *element2Ptr); // prototipo

    int pass; // contatore dei passaggi;
    int j; //contatore dei confronti

    //Ciclo per controllare i confronti

    for(pass = 1; pass < size; pass++){

        //ciclo per controllare i confronti per ogni passaggio

        for(j = 0; j < size; j++){
            if(array[j] > array[j+1]){
                swap(&array[j], &array[j+1]);
            }
        }
    }
}

void swap(int *element1Ptr, int *element2Ptr){
    int hold = *element1Ptr;
    *element1Ptr = *element2Ptr;
    *element2Ptr = hold;
}
In background ciè nel riordinare i singoli vettori cosa accade? qual'è la differenza tra il classico riordinamento per valori?

I valori del vettore non viene più copiato? ma grazie ai puntatori viene riordinato direttamente?
 

Nico911

Utente Attivo
Certo che il valore dell'array viene copiato. Hai un po di confusione in testa sugli array, confusione che porti anche nell'esercizio, complicando lo in una maniera assurda.
Un array è banalmente un insieme di locazioni consecutive, fine, non c'è altro. A questo punto puoi riferirle per indirizzo o per valore, ma questa cosa la puoi fare per QUALUNQUE variabile, l'unica differenza è che se scrivo int array[5] ={1,2,3,4,5}; a questo punto array definisce un INDIRIZZO perché? Perché non posso definire 5 indirizzi per 5 locazioni è troppo complicato e lede la semplicità di programmazione(se l'array ha 100 locazioni? Devo ricordarmi ogni locazione? Un po complicato no?), no ne tengo solo uno l'indirizzo iniziale e gli altri li ricavo con la sintassi array[x] che è la stessa cosa di scrivere *(array+sizeof(int)*x), (ind_iniziale+dim_loc*num_loc)=>accesi a questo indirizzo con la dereferenzi azione.

Il bubble sort è chiamato così perche è un ordinamento "a bollicine", i valori si muovono come se fossero le bollicine dello spumante risalgono l'array e si mettono nella giusta posizionati. Cominci dal primo valore e scorri tutto l'array, se il valore successivo è minore, li scambi e continui gli scambi col successivo finché è possibile(il valore sale lungo l'array) a quel punto riparti col secondo valore e se possibile fai "risalire" quello, poi il terzo fino a che non hai fatto tutto l'array.
I valori si scambiano usando una variabile di appoggio con un operazione del tipo
C:
Int num; int seq_num; int app;
If(num>seq_num){
   App=seq_num;
   seq_num=seq;
   seq = app;
}
Che è quello che fai con swap solo che fai parecchi rigiri con gli indirizzi e i valori, che funziona, solo che complichi per nulla, aggiungi una funzione per fare 3 operazioni, ma, in una funzione i parametri non sono le variabili originali che gli assegni, sono delle nuovevariabili a cuii tu gli assegni il valore dell'array, e tutte le operazioni che farebbe la swap non modiricherebbero i valori dell'arry originale. Come si risolve? Passando l'indirizzo della locazioni, in questo modo tu lavori sulle variabili originali. Ma a questo punto non puoi lavorare sul puntatore, il puntatore ti tiene l'indirizzo della variabile originale. Lo devi dereferenziare (*) e accedere così all'indirizzo che ci hai depositato.

I valori li copi lo stesso, leggi il valore contenuto dentro l'indirizzo degli array, li confronti ed eventualmente scambi i valori dentro l'indirizzo fornito. Semplicemente ci aggiungi il passo(accedi all'indirizzo). Rileggendo mi accorgo che non sono stato molto chiaro ma sono sul cell quindi porta pazienza xD se non hai capito richiedi
 
Ultima modifica:

Entra

oppure Accedi utilizzando