[DOMANDA][C]Bubble Sort

Dario Salvati

Utente Attivo
1,401
247
CPU
Intel Core i5-3470
Scheda Madre
ASUS P8Z77-V LX
HDD
Western Digital Green 1TB 7200rmp + Crucial M550 128Gb
RAM
Corsair 8Gb(2x4GB) 1600Mhz
GPU
Msi GeForce 770 2Gb
Audio
Integrata mainbord
Monitor
Asus VE247H / 23.6"
PSU
XFX 550W Core Edition
Case
Fractal Design R4
OS
Arch Linux + Gnome
Ciao a tutti guyz,
dato che sono nuovo nella programmazione, vi chiedo a priori di avere un po' di pazienza con me, imparo quel che posso il prima possibile :asd:
Da qualche giorno sto cercando di capire bene il bubble sort, dato che il professore ci ha introdotto agli array, ma ho ancora qualche difficoltà.
Mi rivolgo a voi perché sono sicuro che voi siete in grado di scomporre il codice e spiegarmelo per bene.
Il codice di cui parlo l'ho trovato su internet e funziona alla perfezione:
Codice:
#include <stdio.h>
 
int main()
{
  int array[100], n, c, d, swap;
 
  printf("Inserisci il numero di elementi dell'array: ");
  scanf("%d", &n);
 
  printf("Inserisci %d i valori:\n ", n);
 
  for (c = 0; c < n; c++)
    scanf("%d", &array[c]);
 
  for (c = 0 ; c < ( n - 1 ); c++)
  {
    for (d = 0 ; d < n - c - 1; d++)
    {
      if (array[d] > array[d+1])
      {
        swap       = array[d];
        array[d]   = array[d+1];
        array[d+1] = swap;
      }
    }
  }
 
  printf("La lista in ordine crescente è:\n");
 
  for ( c = 0 ; c < n ; c++ )
     printf("%d\n", array[c]);
 
  return 0;
}

Adesso, vi vorrei dire cosa ho capito io dal codice: diciamo che la prima parte è relativa, serve solo a riempire l'array con i numeri che vogliamo ordinare. Quello che mi confonde è "l'intersezione" di quei cicli.
Suppongo che il ciclo più interno (quello che poi è seguito dall' if e dagli swap) sia per trovare il numero più piccolo e posizionarlo nella prima variabile dell'array (di sicuro mi sarò espresso malissimo, ma spero abbiate capito).
Adesso, i cicli che lo precedono non mi sono molto chiari, quindi se qualcuno gentilmente me li spiega, mi fa un enorme favore :asd:
Non capisco come facciano ad escludere il numero minore che abbiamo già posizionato dal ciclo che viene dopo quello per trovare appunto il numero minore.

Spero che abbiate capito (in caso contrario, mea culpa xD) e che possiate aiutarmi.
Grazie per l'attenzione.
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Il ciclo interno fa risalire nell'array il valore più grande tra quelli non ordinati.
Dopo ogni iterazione del ciclo interno, ci sarà un elemento in più tra quelli ordinati (a fine array) e un elemento in meno da ordinare.
Il ciclo esterno conta quanti elementi sono già ordinati (c elementi) e determina il punto in cui il loop interno si deve fermare, infatti l'iterazione interna è fatta dall'elemento in posizione 0 (il primo non ordinato) all'elemento in posizione n-c-1 che è l'ultimo tra i non ordinati (l'elemento in posizione n-c è il minore tra quelli già ordinati).
L'ordinamento termina quando c = n - 1, ovvero quando n - 1 elementi sono stati ordinati. L'n-esimo elemento è quello che è rimasto in posizione 0 e sarà il minore degli elementi dell'array.
 
  • Mi piace
Reazioni: Dario Salvati

Dario Salvati

Utente Attivo
1,401
247
CPU
Intel Core i5-3470
Scheda Madre
ASUS P8Z77-V LX
HDD
Western Digital Green 1TB 7200rmp + Crucial M550 128Gb
RAM
Corsair 8Gb(2x4GB) 1600Mhz
GPU
Msi GeForce 770 2Gb
Audio
Integrata mainbord
Monitor
Asus VE247H / 23.6"
PSU
XFX 550W Core Edition
Case
Fractal Design R4
OS
Arch Linux + Gnome
Grazie, gentilissimo come sempre ^_^
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Ti consiglio di imparare ad usare un debugger: vedere cosa fa un istruzione è indubbiamente più semplice che analizzare del codice, che può essere relativamente chiaro o non.
 

Dario Salvati

Utente Attivo
1,401
247
CPU
Intel Core i5-3470
Scheda Madre
ASUS P8Z77-V LX
HDD
Western Digital Green 1TB 7200rmp + Crucial M550 128Gb
RAM
Corsair 8Gb(2x4GB) 1600Mhz
GPU
Msi GeForce 770 2Gb
Audio
Integrata mainbord
Monitor
Asus VE247H / 23.6"
PSU
XFX 550W Core Edition
Case
Fractal Design R4
OS
Arch Linux + Gnome
Ma io li provo i software che scrivo/scopiazzo da internet, solo che questi ultimi spesso non mi sono chiari, non nella loro funzione, ma per la loro struttura.
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Il debugger si usa con parsimonia, e serve a fare quello che gli da il nome: debug.
C'è infatti un motivo per cui si dovrebbero prima studiare gli algoritmi e poi applicarli. Sfido a fare il debug con più cicli annidati, chiamate a funzioni e costrutti condizionali, il debugger serve ad altro, non certo a capire cosa fa un codice (e se non si sa cosa fa una istruzione è meglio ripassare un po' di basi).
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili