Algoritmo notevole
Devo implementare l'algoritmo bubble sort in c ma non riesco a trovare una condizione per la terminazione dell'algoritmo, qualcuno può aiutarmi ?
Dal momento che nel caso peggiore servono $n^2$ iterazioni dovrei forse imporre che il ciclo sia eseguito appunto $n^2$ volte ?

Dal momento che nel caso peggiore servono $n^2$ iterazioni dovrei forse imporre che il ciclo sia eseguito appunto $n^2$ volte ?
Risposte
Ciao,
non mi è chiaro il tuo problema...
L'algoritmo termina semplicemente quando a completato tutti i confronti, prima nel ciclo annidato e poi il ciclo esterno (nella versione classica iterativa), cioè esempio quando finisce il vettore.
non mi è chiaro il tuo problema...
L'algoritmo termina semplicemente quando a completato tutti i confronti, prima nel ciclo annidato e poi il ciclo esterno (nella versione classica iterativa), cioè esempio quando finisce il vettore.
Allora, se mi è ben chiaro l'algoritmo bubble sort confronta un elemento di un vettore con il successivo e nel caso il secondo elemento sia maggiore del primo ne scambia i valori. Dal momento che per ordinare un vettore non basta un solo ciclo, ma ne servono molteplici (appunto fino a quando il vettore non è completamente ordinato) servirebbe una condizione per stabilire quante volte questo ciclo deve essere applicato all'intero vettore.
Potrei fare in questo modo: verificare dopo ogni iterazione se l'intero vettore è ordinato, ma è proprio questo che vorrei evitare. Non so se ogni volta sia necessaria questa verifica o se è possibile trovare una condizione che mi permetta di capire se ormai il vettore è ordinato.
Mi spiego con un esempio: se ho il vettore 1 8 15 6 3 0
dopo la prima iterazione sono certo che 15 raggiungerà l'ultima posizione, dopo la seconda iterazione so che 8 sarà in penultima posizione e cosi via. Quello che vorrei fare è sfruttare questo o altri accorgimenti per evitare la verifica sull'intero vettore! (che è quello che non riesco a fare)
Potrei fare in questo modo: verificare dopo ogni iterazione se l'intero vettore è ordinato, ma è proprio questo che vorrei evitare. Non so se ogni volta sia necessaria questa verifica o se è possibile trovare una condizione che mi permetta di capire se ormai il vettore è ordinato.
Mi spiego con un esempio: se ho il vettore 1 8 15 6 3 0
dopo la prima iterazione sono certo che 15 raggiungerà l'ultima posizione, dopo la seconda iterazione so che 8 sarà in penultima posizione e cosi via. Quello che vorrei fare è sfruttare questo o altri accorgimenti per evitare la verifica sull'intero vettore! (che è quello che non riesco a fare)

Se nell'ultimo ciclo eseguito non hai effettuato scambi vuol dire che il vettore è ordinato. Altrimenti puoi eseguire un n° di cicli pari alla lunghezza dell'array meno uno. Se ci pensi un attimo vedrai sicuramente il perché di queste mie affermazioni.
Come faccio a verificare che non ci sono stati scambi ?
