Algoritmi di ordinamento in C# : Selection sorts
Vediamo come utilizzare l'algorimo Selection Sorts e l'algoritmo Heap Sort. Codici ed esempi.
Nella categoria del tipo selection sorts, abbiamo due algoritmi. Uno si chiama, come la categoria, Selection Sorts, l’altro è l’Heap Sort.
L’algoritmo Selection Sorts
È essenzialmente un algoritmo di confronto. Ha una complessità O(n2) che rende inefficiente l’ordinamento su elenchi di grandi dimensioni ed è generalmente peggiore dell’Insertion Sort e simili. L’algoritmo ha il pregio di essere noto per la sua semplicità e ha anche prestazioni migliori rispetto ad algoritmi complessi in determinate situazioni. L’ordinamento viene eseguito meglio del Bubble Sort in quasi tutti i casi.
- Nel migliore dei casi - O(n2)
- Caso medio - O(n2)
- Caso peggiore - O(n2)
- Stabilità - dipende dall’implementazione
private void SelectionSort(long[] inputArray)
{
long index_of_min = 0;
for (int iterator = 0; iterator < inputArray.Length - 1; iterator++)
{
index_of_min = iterator;
for (int index = iterator+1; index < inputArray.Length; index++)
{
if (inputArray[index] < inputArray[index_of_min])
index_of_min = index;
}
Swap(ref inputArray[iterator], ref inputArray[index_of_min]);
}
}
Heap Sort
Si tratta di un algoritmo di ordinamento che si basa sul confronto. Anche se un po’ più lento ha una buona implementazione rispetto al Quick Sort e il vantaggio che nel peggiore dei casi ha una complessità n logn. L’Heap Sort è un algoritmo di posto, ma non è un ordinamento stabile. Lavora come suggerisce il suo nome. Si comincia con la costruzione di un gruppo fuori del set di dati, rimuovendo il più grande elemento e inserendolo alla fine in modo da ottenere un array ordinato. Dopo aver rimosso l’elemento più grande, ricostruisce il gruppo, elimina dai rimanenti il valore più grande, e lo pone alla fine dell’array ordinato. Questo si ripete fino a quando non ci sono più elementi nel gruppo e l’array ordinato si è riempito. L’implementazione richiede due array, uno per tenere il gruppo e l’altro per contenere gli elementi ordinati.
L’ Heap Sort inserisce gli elementi della lista di ingresso in una struttura dati detta heap. Il valore più grande (in un max-heap) viene estratto finché non ne rimane più alcun elemento. L’unico costo è quello dell’estrazione.
- Nel migliore dei casi - O(n log n)
- Caso medio - O(n log n)
- Caso peggiore - O (n log n)
- Stabilità - instabile
private void HeapSort(long[] inputArray)
{
for (int index = (inputArray.Length / 2) - 1; index >= 0; index--)
Heapify(inputArray, index, inputArray.Length);
for (int index = inputArray.Length - 1; index >= 1; index--)
{
SwapWithTemp(ref inputArray[0], ref inputArray[index]);
Heapify(inputArray, 0, index - 1);
}
}
La funzione su mostrata richiama la funzione Heapify(), che costruisce una struttura di mucchio di dati utilizzando una delle proprietà dell’heap, che dice che se B è un nodo figlio di A e (A) ≥ (B), ciò implica che un elemento con il più grande valore è sempre il nodo radice (max-heap).
private void Heapify(long[] inputArray, int root, int bottom)
{
bool completed = false;
int maxChild;
while((root*2 <= bottom) && (!completed))
{
if (root * 2 == bottom)
maxChild = root * 2;
else if (inputArray[root * 2] > inputArray[root * 2 + 1])
maxChild = root * 2;
else
maxChild = root * 2 + 1;
if (inputArray[root] < inputArray[maxChild])
{
SwapWithTemp(ref inputArray[root], ref inputArray[maxChild]);
root = maxChild;
}
else
{
completed = true;
}
}
}
- Articolo precedente Algoritmi di ordinamento in C# : Exchange Sort
- Articolo successivo Algoritmi di ordinamento in C#: Insertion Sort