Salta al contenuto
Note per Studenti Esercizio 4 · ordinamento con scambi, traccia e invariante

Esercizio 4ordinamento con scambi, traccia e invariante

In questa pagina 3

Testo (scritto del 19/09/2023, seconda parte, esercizio 1, 4 punti). Si consideri il seguente algoritmo che riceve in input una sequenza SS di nn interi.

for i <- 0 to n-2 do
    for j <- i+1 to n-1 do
        if (S[j] < S[i]) then swap(S[i], S[j])

(a) Eseguire l'algoritmo con input S=12,1,14,10,8,5S = 12, 1, 14, 10, 8, 5, quindi n=6n = 6, e riportare lo stato della sequenza alla fine di ciascuna iterazione del ciclo for esterno.

(b) Dire cosa fa l'algoritmo in generale e trovare un opportuno invariante che deve valere all'inizio del ciclo for esterno e alla fine di ciascuna sua iterazione.


(a) Traccia

Si confronta S[i]S[i] con ogni elemento successivo e, se ne trova uno minore, lo scambia con la posizione ii. Alla fine del ciclo interno S[i]S[i] contiene quindi il minimo di S[i..n−1]S[i..n-1].

Fine iterazione ii Sequenza
(inizio) 12,1,14,10,8,512, 1, 14, 10, 8, 5
i=0i = 0 1,12,14,10,8,51, 12, 14, 10, 8, 5
i=1i = 1 1,5,14,12,10,81, 5, 14, 12, 10, 8
i=2i = 2 1,5,8,14,12,101, 5, 8, 14, 12, 10
i=3i = 3 1,5,8,10,14,121, 5, 8, 10, 14, 12
i=4i = 4 1,5,8,10,12,141, 5, 8, 10, 12, 14

Ad esempio per i=0i = 0: S[1]=1<12S[1] = 1 < 12 scambia (1,12,…1, 12, \dots); gli altri non sono minori di 11. Per i=1i = 1 (S[1]=12S[1] = 12): 14,10<1214, 10 < 12? 1414 no; 10<1210 < 12 scambia →1,10,14,12,8,5\to 1, 10, 14, 12, 8, 5; 8<108 < 10 scambia →1,8,14,12,10,5\to 1, 8, 14, 12, 10, 5; 5<85 < 8 scambia →1,5,14,12,10,8\to 1, 5, 14, 12, 10, 8. (Tracce verificate eseguendo il codice.)

(b) Cosa fa e invariante

L'algoritmo ordina SS in senso crescente. È una variante del selection sort (vedi Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →) che, invece di scegliere l'indice del minimo e fare uno scambio, scambia ogni volta che trova un elemento minore: più scambi, stessi n(n−1)2\frac{n(n-1)}{2} confronti.

Invariante del ciclo esterno (all'inizio dell'iterazione ii, e alla fine dell'iterazione i−1i-1): S[0..i−1]S[0..i-1] contiene i ii elementi più piccoli di SS, in ordine crescente; di conseguenza S[0]≤⋯≤S[i−1]≤S[k]S[0] \le \dots \le S[i-1] \le S[k] per ogni k≥ik \ge i.

  • Inizio (i=0i = 0): il prefisso è vuoto.
  • Conservazione. L'iterazione ii porta in S[i]S[i] il minimo di S[i..n−1]S[i..n-1]. Infatti (invariante del ciclo interno): dopo l'iterazione jj, S[i]S[i] è il minimo di S[i..j]S[i..j] originali dell'iterazione e il multiset S[i..n−1]S[i..n-1] non cambia. Base: prima del ciclo interno S[i]S[i] è il minimo di S[i..i]S[i..i]. Passo: se S[j]<S[i]S[j] < S[i] si scambiano e S[i]S[i] diventa il nuovo minimo; altrimenti S[i]S[i] resta minimo di S[i..j]S[i..j]. Alla fine S[i]=min⁡S[i..n−1]S[i] = \min S[i..n-1]: aggiunto al prefisso, che per ipotesi contiene i più piccoli e ha tutti gli elementi ≤\le quelli di S[i..n−1]S[i..n-1], mantiene l'invariante con i+1i + 1 elementi.
  • Uscita: dopo i=n−2i = n - 2 il prefisso S[0..n−2]S[0..n-2] contiene i n−1n - 1 elementi più piccoli ordinati e l'ultimo, S[n−1]S[n-1], è per forza il massimo: la sequenza è ordinata.

Errori comuni

  • Dimenticare che dopo l'iterazione ii non solo S[i]S[i] è al suo posto, ma tutto S[0..i]S[0..i] contiene i più piccoli: l'invariante riguarda anche i valori e non solo l'ordine relativo.
  • Scrivere un invariante valido solo alla fine del ciclo esterno.
  • Pensare che il resto della sequenza (S[i..n−1]S[i..n-1]) resti nell'ordine originale: dopo gli scambi viene rimescolato.

Versione ripasso

Testo. for i <- 0 to n-2: for j <- i+1 to n-1: if S[j] < S[i] then swap(S[i], S[j]). (a) Traccia con S=12,1,14,10,8,5S = 12, 1, 14, 10, 8, 5 a fine di ogni iterazione esterna. (b) Cosa fa? Invariante del ciclo esterno.

Teoria collegata