L’idea è di far crescere a sinistra la parte ordinata dell’array trovando ripetutamente l’elemento minimo della parte non ordinata e spostandolo all’inizio della parte non ordinata.
Una sua particolarità è avere il numero di confronti/scambi fisso.
Funzionamento
- Divide l’array in due parti, ordinata (inizialmente vuota) e non ordinata.
- Ad ogni iterazione:
- considera l’elemento alla posizione i come minimo,
- cerca l’elemento minimo nella parte non ordinata,
- lo scambia con il primo elemento della parte non ordinata,
- espande la parte ordinata includendo il nuovo elemento.
Complessità
Ha complessità temporale perché itera su una porzione della lista per ogni elemento e il caso ottimo e il caso pessimo coincidono perché il numero di scambi tra elementi è fisso.
Ha complessità spaziale perché opera in loco.
Implementazione
def selection_sort(lista):
n = len(lista)
# scorre l'array con indice i da 0 a n-1
for i in range(n-1):
# considera l'elemento alla posizione i come minimo
indice_min = i
# cerca l'indice dell'elemento minimo nella parte non ordinata
for j in range(i+1, n):
if lista[j] < lista[indice_min]:
indice_min = j
# scambia l'elemento minimo con quello considerato in partenza, facendo crescere di un elemento la parte ordinata
lista[i], lista[indice_min] = lista[indice_min], lista[i]
return lista