Menu
Coddy logo textTech

Selection sort

Ultimo aggiornamento

Il selection sort divide l'array in una zona ordinata a sinistra e una zona non ordinata a destra. A ogni passata scorre la zona non ordinata per trovare l'elemento più piccolo, poi lo scambia nella prima posizione non ordinata, facendo crescere di uno la zona ordinata. Premi play qui sopra per vedere scansione e scambio, o segui un confronto alla volta.

Il selection sort fa sempre lo stesso numero di confronti qualunque sia l'input, ma esegue al massimo n-1 scambi, molti meno del bubble sort, e questo può contare quando le scritture sono costose.

Complessità temporale e spaziale

CasoComplessitàNote
Caso miglioreO(n²)I confronti avvengono anche se è ordinato
Caso medioO(n²)Ordine casuale
Caso peggioreO(n²)Ordinato al contrario
SpazioO(1)In loco
StabileNoGli scambi possono riordinare gli elementi uguali

Passo dopo passo

PassoCosa succede
1Considera l'intero array come non ordinato.
2Scorri la zona non ordinata per trovare l'elemento minimo.
3Scambia quel minimo nella prima posizione non ordinata.
4Sposta il confine di un passo a destra (quella posizione ora è ordinata).
5Ripeti finché resta un solo elemento non ordinato.

Esempio svolto

Ordinamento di [5, 2, 4, 1]:

PassataArrayAzione
Inizio[5, 2, 4, 1]L'intero array è non ordinato.
1[1, 2, 4, 5]Scorri [5, 2, 4, 1], il minimo è 1 all'indice 3; scambialo con l'indice 0.
2[1, 2, 4, 5]Scorri [2, 4, 5], il minimo è 2, già all'indice 1; lo scambi con se stesso.
3[1, 2, 4, 5]Scorri [4, 5], il minimo è 4, già all'indice 2; nessuno spostamento necessario.
Fine[1, 2, 4, 5]Resta solo 5, quindi è già al suo posto.

Quando usare il selection sort

Usalo quandoEvitalo quando
Le scritture sono costose: fa al massimo n-1 scambi.L'array è grande: dominano i confronti O(n²).
Ti serve un ordinamento in loco semplice e facile da implementare.Ti serve un ordinamento stabile che preservi l'ordine delle chiavi uguali.
La memoria è poca: usa solo O(1) di spazio extra.I dati sono quasi ordinati: non può terminare prima come l'insertion sort.
L'insieme di dati è minuscolo e contano prestazioni prevedibili.Conta la velocità complessiva: gli ordinamenti O(n log n) come il quicksort sono molto più veloci.

Codice Selection Sort

Un'implementazione di Selection Sort pulita ed eseguibile in Python, JavaScript, Java, C++, C, Pseudocode. Scegli un linguaggio, copia il codice o aprilo già caricato nel Playground di Coddy.

Codice Selection Sort in Python

Python
1def selection_sort(a):2    n = len(a)3    for i in range(n - 1):4        # Find the smallest element in the unsorted tail5        min_idx = i6        for j in range(i + 1, n):7            if a[j] < a[min_idx]:8                min_idx = j9        a[i], a[min_idx] = a[min_idx], a[i]10    return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)
Esegui questo codice nel playground Python

Domande frequenti sul selection sort

Qual è la complessità temporale del selection sort?
Il selection sort è O(n²) in tutti i casi, migliore, medio e peggiore, perché scorre sempre l'intera zona non ordinata per trovare ogni minimo. Usa O(1) di spazio extra.
Il selection sort è stabile?
La versione standard in loco non è stabile, perché scambiare al suo posto un minimo lontano può far scavalcare un elemento uguale a un altro. Esiste una variante stabile, ma richiede di spostare gli elementi invece di scambiarli.
Quando è utile il selection sort?
È utile quando il costo di scrittura in memoria è alto, dato che esegue al massimo n-1 scambi: il minimo possibile per un ordinamento per confronto che sposta gli elementi.
Qual è la differenza tra selection sort e bubble sort?
Sono entrambi ordinamenti per confronto O(n²), ma il selection sort fa al massimo n-1 scambi, mentre il bubble sort può farne fino a O(n²). Il bubble sort può anche accorgersi che un array è già ordinato e fermarsi prima, mentre il selection sort esegue sempre tutte le passate.
Meglio il selection sort o l'insertion sort?
Nella maggior parte dei casi preferisci l'insertion sort: è stabile, richiede O(n) su dati quasi ordinati ed è più veloce in media. Scegli il selection sort solo quando la priorità è ridurre al minimo il numero di scritture, dato che garantisce al massimo n-1 scambi.
Perché il selection sort richiede sempre O(n²) anche su un array ordinato?
Il selection sort non ha modo di sapere che un elemento è già il minimo senza scorrere il resto della zona non ordinata, quindi esegue ogni confronto a ogni passata indipendentemente dall'ordine dell'input. Questo significa che il caso migliore coincide con il peggiore, O(n²), a differenza dell'insertion sort o del bubble sort, che possono interrompersi prima.
Illustrazione dei linguaggi di programmazione di Coddy

Padroneggia gli algoritmi con Coddy

INIZIA