Qualcuno può spiegarmi come utilizzare il MargeSort in C#??
In particolare questo codice di esempio:
public class Sort
{
public void Ordina(int[] vett)
{
int[] tmpVett; // vettore di appoggio
tmpVett = new int [vett.Lenght];
// chiama al vero metodo di ordinamento ricorsivo dove primo = 0 e ultimo = vett.Lenght-1
mergeSort(vett, tmpVett, 0, vett.Lenght-1);
}
private void mergeSort(int[] vett, int[] tmpVett, int primo, int ultimo)
// è neccessario passare un vettore di appoggio, il primo e l' ultimo indice utile del vettore da ordinare.
{
if(primo < ultimo) // il vettore ha almeno un elemento
{
int medio = (primo + ultimo) / 2; // indice centrale
mergeSort(vett, tmpVett, primo, medio); // chiamata ricorsiva 1° metà
mergeSort(vett, tmpVett, medio + 1, ultimo); // chiamata ricorsiva 2° metà
merge(vett, tmpVett, primo, medio + 1, ultimo); // fusione (eseguito alla fine)
}
}
private void merge(int[] vett, int[] tmpVett, int indice1, int indice2, int fine2)
{
// il sottovettore1 finisce una posizione prima dell' inizio del sottovettore2
int fine 1 = indice2 - 1;
int inizio = indice 1; // puntatore all' indice iniziale
int indiceTemp = indice1; // indice per copiare i dati della fusione in tmpVett
// se ho ancora elementi da scorrere in entrambi i sottovettore
while (indice1 <= fine1 && indice2 <= fine2)
if((vett[indice1]) < (vett[indice2])) // se è il più piccolo in posiz. indice1
{
tmpVett[indiceTmp] = vett[indice1]; // copio in vettTemp
indice1++; // incremento il cursore del sottovettore1
indiceTmp++; // incremento il valore del cursore in tmpVett
}
else
{
tmpVett[indiceTmp] = vett[indice2];
indice2++; // incremento il cursore del sottovettore2
indiceTmp++; // incremento il valore del cursore in tmpVett
}
// Se si esce dal primo while significa che uno dei sottovettori è terminato
while(indice1 <= fine1) // il sottovettore1 non è ancora terminato
// finisco di copiare in tempVett gli elementi in sottovettore1
{
tmpVett[indiceTmp] = vett[indice1];
indice1++;
indiceTmp++;
}
while (indice2 <= fine2) // il sottovettore2 non è ancora terminato
// finisco di copiare in tempVett gli elementi rimasti in sottovettore2
{
tmpVett[indiceTmp] = vett[indice2];
indice2++;
indiceTmp++;
}
// copia dei valori dal vettore temporaneo al vettore passato come parametro
for(int i = inizio; i <= fine2; i++)
{
vett[i] = tmpVett[i];
}
}
}
Il codice è funzionante e vorrei capire come funziona questa marea di roba. Grazie

Rispondi quotando

