Selection sort: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Annullata la modifica di 88.55.113.74 (discussione), riportata alla versione precedente di Phantomas
Etichetta: Rollback
 
(29 versioni intermedie di 22 utenti non mostrate)
Riga 1:
{{Algoritmo
|classe = [[Algoritmo di ordinamento]]
|immagine = SelectionSorting selection sort animationanim.gif
|didascalia = Animazione dell'algoritmo che ordina dei numeri casuali
|struttura dati = [[Array]]
Riga 10:
|ottimale = No
}}
L<nowiki>{{'</nowiki>}}'''ordinamento per selezione''' ('''selection sort''') è un [[algoritmo di ordinamento]] che opera [[Algoritmo in loco|in place]] ed in modo simile all'[[insertion sort|ordinamento per inserzione]]. L'algoritmo è di tipo non adattivo, ossia il suo tempo di esecuzione non dipende dall'input ma dalla dimensione dell'array.
 
== Descrizione dell'algoritmo ==
L'algoritmo ''seleziona'' di volta in volta il numero minore nella sequenza di partenza e lo sposta nella sequenza ordinata; di fatto la sequenza viene suddivisa in due parti: la sottosequenza ordinata, che occupa le prime posizioni dell'array, e la sottosequenza ''da'' ordinare, che costituisce la parte restante dell'array.
 
{|
|
Riga 31 ⟶ 30:
<math>\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} c </math>, dove ''c'' è una costante, dato che l'operazione effettuata può essere rappresentata da una costante.
 
<math>\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} 1 = \sum_{i=1}^{n-1} (n - (i + 1) + 1 ) = \sum_{i=1}^{n-1}(n-i) = \sum_{i=1}^{n-1} n - \sum_{i=1}^{n-1} i \approx n(n-1) - \frac{n(n +- 1)}{2} \approx \frac{n^2}{2} = \theta(n^2) </math>
 
L'ordinamento per selezione effettua <math>N(N-1)/2</math> confronti e, nel caso peggiore/migliore/medio, <math>\theta(n-1)</math> scambi.
Riga 40 ⟶ 39:
Quella che segue è una rappresentazione in [[pseudocodice]] del Selection sort:
 
'''procedure''' SelectionSort(a: ''lista dei numeri da ordinare'');
'''for''' i = 0 '''to''' n - 1
posmin ← i
Riga 50 ⟶ 49:
a[i] ← a[posmin]
a[posmin] ← tmp
 
 
==Implementazioni==
Di seguito una possibile implementazione in [[Java (linguaggio di programmazione)|Java]] :
 
<sourcesyntaxhighlight lang="java" line="1">
class SelectionSort{
public void selectionSort(int[] a){
int min, temp;
public static void forsort(int i=0;i<a.length-1;i++arr[]){
// Lunghezza min=i;array
for(int jn=i+1;j<aarr.length;j++){
// Incrementa di 1 il limite inferiore del sub array da if(a[min]>a[j]){ordinare
for (int i = 0; i < n-1; i++) min=j;
{ }
// Trova il minimo nel subarray da ordinare
int indice_min = i;
for (int j = i+1; j < n; j++) {
// Confronto per trovare un nuovo minimo
if (arr[j] < arr[indice_min])
indice_min = j; // Salvo l'indice del nuovo minimo
}
if(min!=i){
// Scambia il minimo temp=a[min];trovato con il primo elemento
a[min]=a[swap(arr,indice_min,i]);
} a[i]=temp;
}
}
private static void swap(int[] arr, int a , int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
</source>
}
</syntaxhighlight>
 
== Casi limite ==
Un inconveniente dell'algoritmo di ordinamento per selezione è che il tempo di esecuzione dipende solo in modo modesto dal grado di ordinamento in cui si trova il file. La ricerca del minimo elemento durante una scansione del file non sembra dare informazioni circa la posizione del prossimo minimo nella scansione successiva. Chi utilizza questo algoritmo potrebbe stupirsi nel verificare che esso impiega più o meno lo stesso tempo sia su file già ordinati che su file con tutte le chiavi uguali, o anche su file ordinati in modo casuale.
 
Nonostante l'approccio ''brutale'' adottato, l'ordinamento per selezione ha un'importante applicazione: poiché ciascun elemento viene spostato al più una volta, questo tipo di ordinamento è il metodo da preferire quando si devono ordinare file costituiti da record estremamente grandi e da chiavi molto piccole. Per queste applicazioni il costo dello spostamento dei dati è prevalente sul costo dei confronti e nessun algoritmo è in grado di ordinare un file con spostamenti di dati sostanzialmente inferiori a quelli dell'ordinamento per selezione.
 
== Altri progetti ==
{{interprogetto|commons=Category:Selection sort|b=Implementazioni di algoritmi/Selection sort|b_oggetto=implementazioni|b_preposizione=didel|preposizione=sul}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
 
{{ordinamento}}
{{portale|informatica}}
 
[[Categoria:Algoritmi di ordinamento]]