Algoritmi di ordinamento - Università degli Studi di Brescia
by user
Comments
Transcript
Algoritmi di ordinamento - Università degli Studi di Brescia
Alcuni metodi di ordinamento Algoritmi di ordinamento • Ordinamento per inserimento diretto (insertion sort) • Ordinamento per selezione (selection sort) • Ordinamento “a bolle” (bubble sort) Fondamenti di Informatica A Ingegneria Gestionale Università degli Studi di Brescia Docente: Prof. Alfonso Gerevini Ordinamento per inserimento diretto 2 Fondamenti di Informatica A – Università di Brescia Docente: A. Gerevini Ordinamento per inserimento diretto Idea di base 1) si considera il secondo elemento e lo si inserisce nella prima posizione se risulta minore del primo elemento. Se non è minore del primo elemento rimane dov’è. 44 55 12 42 94 18 44 55 12 42 94 18 2) si considera il terzo elemento e lo si inserisce nella prima o nella seconda posizione, a seconda che sia minore del primo o del secondo elemento. Se non è minore di nessuno dei due rimane dov’è 12 44 55 42 94 18 12 42 44 55 94 18 3) si considera il quarto elemento e lo si inserisce nella prima o nella seconda o nella terza posizione, a seconda che sia minore del primo o del secondo o del terzo elemento. Se non è minore di nessuno dei due rimane dov’è. 12 42 44 55 94 18 12 18 42 44 55 94 44 … e così via fino a considerare tutti gli elementi Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 3 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 4 inizio Inserimento diretto i←1 n ← 100 fine no • Supponiamo all’inizio di avere il vettore a seguente Ipotesi: i<n supponiamo di considerare un vettore di 100 elementi indicizzati da 0 a 99 sì x ← a[i] j←i-1 (j>=0) AND (x < a[j]) sì no a[j+1] ← x i←i+1 a[j+1] ← a[j] j←j-1 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia Come funziona? 5 a Passi di ordinamento: 1. n = 6 (supponiamo che il numero di elementi significativi sia 6) 2. i = 1 3. x = a[1] = 55 4. j = i – 1 = 0 5. Controllo se ((j >=0) && (x < a[0])) Î non è vero (x vale 55 ed a[0] vale 44) 6. a[j+1] = x = 55 Docente: A. Gerevini Esecuzione (continua…) 7. 8. 9. 10. 11. 12. 13. Controllo se ((j >=0) && (x < a[0])) Î è vero (x vale 12 ed a[0] vale 44) 14. a[1] = a[0] = 44 a 44 44 55 42 94 18 15. j = j – 1 = -1 Docente: A. Gerevini 55 42 94 18 Fondamenti di Informatica A – Università di Brescia Fondamenti di Informatica A – Università di Brescia 6 Esecuzione (continua…) i=i+1=2 x = a[2] = 12 j=i–1=1 Controllo se ((j >=0) && (x < a[1])) Î è vero (x vale 12 ed a[1] vale 55) a[2] = a[1] = 55 a 44 55 55 42 94 18 j = j –1 = 0 16. Controllo se ((j >=0) && (x < a[-1])) Î non è vero 17. a[0] = x = 12 a 12 44 18. i = i + 1 = 3 44 55 12 42 94 18 0 1 2 3 4 5 7 19. 20. 21. 22. 23. 24. 25. 26. x = a[3] = 42 j=i–1=2 Controllo se ((j >=0) && (x < a[2])) Î è vero (x vale 42 ed a[2] vale 55) a[3] = a[2] = 55 a 12 44 55 55 94 18 j=j–1=1 Controllo se ((j >=0) && (x < a[1])) Î è vero (x vale 42 ed a[1] vale 44) a[2] = a[1] = 44 a 12 44 44 55 94 18 j=j–1=0 27. 28. 29. 30. 31. Controllo se ((j >=0) && (x < a[0])) Î non è vero (x vale 42 ed a[0] vale 12) a[1] = x = 42 a 12 42 44 55 94 18 i=i+1=4 x = a[4] = 94 j=i–1=3 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 8 Esecuzione (continua…) Esecuzione (continua…) 32. Controllo se ((j >=0) && (x < a[3])) Î non è vero (x vale 94 ed a[3] vale 55) 44. a[3] = a[2] = 44 33. a[4] = x = 94 45. j = j – 1 = 1 a 12 42 44 55 94 18 a 12 42 44 44 55 94 34. i = i + 1 = 5 46. Controllo se ((j >=0) && (x < a[1])) Î è vero (x vale 18 ed a[1] vale 42) 35. x = a[5] = 18 47. a[2] = a[1] = 42 36. j = i – 1 = 4 48. j = j – 1 = 0 a 12 42 42 44 55 94 37. Controllo se ((j >=0) && (x < a[4])) Î è vero (x vale 18 ed a[4] vale 94) 49. Controllo se ((j >=0) && (x < a[0])) Î non è vero (x vale 18 ed a[0] vale 12) 38. a[5] = a[4] = 94 50. a[1] = x = 18 39. j = j – 1 = 3 a 12 42 44 55 94 94 a 51. i = i + 1 = 6 40. Controllo se ((j >=0) && (x < a[3])) Î è vero (x vale 18 ed a[3] vale 55) 52. Controllo se i < 6 Î non è vero 41. a[4] = a[3] = 55 42. j = j – 1 = 2 53. Fine a 12 42 44 55 55 94 12 18 42 44 55 94 ORDINATI! 43. Controllo se ((j >=0) && (x < a[2])) Î è vero (x vale 18 ed a[2] vale 44) Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 9 Docente: A. Gerevini Programma di ordinamento per inserimento diretto Fondamenti di Informatica A – Università di Brescia 10 Ordinamento per selezione Idea di base main(); /* ordinamento per inserimento diretto */ { int a[100]; int i, j, x, n; n = 100; for (i=1;i<n;i++) { x=a[i]; j=i-1; while ((j>=0) && (x < a[j])) { a[j+1]=a[j]; j:=j-1; } a[j+1]=x; } } Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 1) scambio il primo elemento con il più piccolo 2) scambio il secondo elemento con il secondo più piccolo 3) scambio il terzo elemento con il terzo più piccolo … 11 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 12 inizio Ordinamento per selezione i←0 n ← 100 no 44 55 12 42 94 18 12 55 44 42 94 18 12 18 44 42 94 55 12 18 42 44 94 55 12 18 42 44 94 55 12 18 42 44 55 Ordinamento per selezione i<n-1 sì fine k←i x ← a[i] j ← i +1 no j<n sì 94 k ←j x ← a[j] 44 sì a[j]<x a[k] ← a[i] a[i] = x i←i+1 no j ← j +1 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 13 Docente: A. Gerevini Come funziona? 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 44 55 12 42 94 18 0 1 2 3 4 5 Passi di ordinamento: 1. n = 6 (supponiamo che il numero di elementi significativi sia 6) 2. i = 0 3. Controllo se i < 5 Î è vero 4. k = i = 0 5. x = a[0] = 44 6. j = i + 1 = 1 7. Controllo se j < 6 Î è vero Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 14 Esecuzione (continua…) • Supponiamo all’inizio di avere il vettore a seguente a Fondamenti di Informatica A – Università di Brescia 15 Controllo se a[1] < x Î non è vero j=j+1=2 Controllo se j < 6 Î è vero Controllo se a[2] < x Î è vero k=j=2 x = a[j] = 12 j=j+1=3 Controllo se j < 6 Î è vero Controllo se a[3] < x Î non è vero j=j+1=4 Controllo se j < 6 Î è vero Controllo se a[4] < x Î non è vero j=j+1=5 Controllo se j < 6 Î è vero Docente: A. Gerevini (a[1] vale 55 e x vale 44) (a[2] vale 12 e x vale 44) (a[3] vale 42 e x vale 12) (a[4] vale 94 e x vale 12) Fondamenti di Informatica A – Università di Brescia 16 Esecuzione (continua…) 22. 23. 24. 25. 26. Controllo se a[5] < x Î non è vero j=j+1=6 Controllo se j < 6 Î non è vero a[k] = a[i] = a[2] = 44 a[i] = x = 12 25. 26. 27. 28. 29. 30. 31. 32. 33. i=i+1=1 k=i=1 x = a[i] = 55 j=i+1=2 Controllo se j < 6 Î è vero Controllo se a[2] < x Î è vero k=j=2 x = a[j] = 44 j=j+1=3 Docente: A. Gerevini Esecuzione (continua…) (a[5] vale 18 e x vale 12) a 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 12 55 44 42 94 18 (a[2] vale 44 e x vale 55) Fondamenti di Informatica A – Università di Brescia 17 12 18 44 42 94 55 Fondamenti di Informatica A – Università di Brescia (a[4] vale 94 e x vale 42) (a[5] vale 18 e x vale 42) Fondamenti di Informatica A – Università di Brescia 18 main(); /* ordinamento per selezione { int a[100]; int i, j, k, x, n; n = 100; for (i=0;i<n-1;i++) { k=i; x=a[i]; for (j=i+1;j<n;j++) { if (a[j] < x) { k=j; x=a[j]; } } a[k]=a[i]; a[i]=x; } 48. a[k] = a[5] ← a[i] = a[1] = 55 49. a[i] ← x = 18 ………… eccetera eccetera… completare per esercizio Docente: A. Gerevini Docente: A. Gerevini (a[3] vale 42 e x vale 44) Programma di ordinamento per selezione Esecuzione (continua…) a Controllo se j < 6 Î è vero Controllo se a[3] < x Î è vero k=j=3 x = a[3] = 42 j=j+1=4 Controllo se j < 6 Î è vero Controllo se a[4] < x Î non è vero j=j+1=5 Controllo se j < 6 Î è vero Controllo se a[5] < x Î è vero k=j=5 x = a[5] = 18 j=j+1=6 Controllo se j < 6 Î non è vero 19 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 20 Bubble sort Bubble sort Idea di base 44 55 12 42 94 18 1) L’algoritmo confronta coppie di elementi successivi (con indice j e j - 1) e se occorre li scambia ponendo il minore nella posizione j – 1 12 44 55 18 42 94 2) Alla fine della prima passata dell’intero vettore, l’elemento più piccolo si trova nella prima posizione 12 18 44 55 42 94 12 18 42 44 55 94 12 18 42 44 55 94 12 18 42 44 55 94 3) Alla seconda passata vengono esaminati solo n-1 elementi e l’elemento più piccolo viene a trovarsi nella seconda posizione 4) Alla terza passata si esaminano n-2 elementi, etc. etc. 5) Alla fine della n-1-esima passata gli elementi sono ordinati 44 Fondamenti di Informatica A – Università di Brescia Docente: A. Gerevini 21 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 22 inizio ‘Bubble sort’ i←0 n ← 100 no fine Come funziona? a i<n-1 sì Passi di ordinamento: 1. n = 6 (supponiamo che il numero di elementi significativi sia 6) 2. i = 0 3. Controllo se i < 5 Î è vero 4. j = n –1 = 5 5. Controllo se j > i Î è vero 6. Controllo se a[4] > a[5] Î è vero (a[4] vale 94 e a[5] vale 18) 7. x = a[4] = 94 8. a[4] = a[5] = 18 a 44 55 12 42 18 94 9. a[5] = 94 j←n-1 no j>i sì sì x ← a[j-1] a[j-1] ← a[j] a[j] ← x 44 55 12 42 94 18 0 1 2 3 4 5 i←i+1 a[j-1]>a[j] no j ← j -1 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 23 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 24 Esecuzione (continua…) 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. j = j –1 = 4 Controllo se j > i Î è vero Controllo se a[3] > a[4] Î è vero x = a[3] = 42 a[3] = a[4] = 18 a a[4] = 42 j = j –1 = 3 Controllo se j > i Î è vero Controllo se a[2] > a[3] Î non è vero j = j –1 = 2 Controllo se j > i Î è vero Controllo se a[1] > a[2] Î è vero x = a[1] = 55 a a[1] = a[2] = 12 a[2] = 55 (a[3] vale 42 e a[4] vale 18) 44 55 12 18 42 94 (a[2] vale 12 e a[3] vale 18) (a[1] vale 55 e a[2] vale 12) 44 12 55 18 42 94 Fondamenti di Informatica A – Università di Brescia Docente: A. Gerevini Esecuzione (continua…) 25 Programma ‘Bubble sort’ main(); /* ordinamento a bolle { int a[100]; int i, j, x, n; n = 100; for (i=0;i<n-1;i++) { for (j=n-1;j>i;j--) if (a[j-1] > a[j]) { x=a[j-1]; a[j-1]=a[j]; a[j]=x; } } } Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 27 25. 26. 27. 28. 29. 30. j = j –1 = 1 Controllo se j > i Î è vero Controllo se a[0] > a[1] Î è vero x = a[0] = 44 a[0] = a[1] = 12 a[1] = 44 31. 32. j = j –1 = 0 Controllo se j > i Î non è vero 33. 34. 35. 36. 37. i=i+1=1 Controllo se i < 5 Î è vero j=n–1 Controllo se j > i Î è vero Eccetera… eccetera… per esercizio Docente: A. Gerevini (a[0] vale 44 e a[1] vale 12) a 12 44 55 18 42 94 FINE PRIMA PASSATA PROSSIMA PASSATA da j = 5 fino a i = 1 Fondamenti di Informatica A – Università di Brescia 26