15/07/2018, 15:43
void mergeSort(int arr[], int s, int d)
{
if (s < d)
{
int c = (d - s) / 2;
mergeSort(arr, s, c);
mergeSort(arr, c + 1, d);
merge(arr, s, c, d);
}
}
void merge(int arr[], int s, int c, int d)
{
int* aux = new int[d + 1];
int i, j;
for (i = c + 1; i > s; i--)
aux[i - 1] = arr[i - 1];
for (j = c; j < d; j++)
aux[d + c - j] = arr[j + 1];
for (int k = s; k <= d; k++)
if (aux[j] < aux[i])
arr[k] = aux[j--];
else
arr[k] = aux[i++];
delete[] aux;
}
int a[] = { 10, 3, 15, 2, 1, 4, 9, 0 };
cout << "Ecco l'array disordinato: " << endl;
stampaArray(a, 8);
cout << "Ecco l'array ordinato: " << endl;
mergeSort(a, 0, 7);
stampaArray(a, 8);
mergeSort(arr, c + 1, d);
15/07/2018, 22:33
void merge_(int *v, const unsigned int s, const unsigned int c, const unsigned int d)
{
unsigned int dim = d - s + 1;
int *u = new int[dim];
unsigned int i;
unsigned int i_s = s;
unsigned int i_d = c + 1;
for(i = 0; i < dim; ++i)
{
if(i_s <= c)
{
if(i_d <= d)
{
if(v[i_s] < v[i_d])
{
u[i] = v[i_s++];
}
else
{
u[i] = v[i_d++];
}
}
else
{
u[i] = v[i_s++];
}
}
else
{
u[i] = v[i_d++];
}
}
for(i = 0; i < dim; ++i)
{
v[s + i] = u[i];
}
delete[] u;
}
16/07/2018, 08:48
void merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1)
{
arr[k] = L[i];
i++;
k++;
}
while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}
16/07/2018, 09:27
però guardando in rete la soluzione più classica per l'algoritmo di fusione dei vettori, ovvero la funzione merge è:...
Poi volevo togliermi un altro dubbio per quanto riguarda la funzione mergeSort: la prima funzione ricorsiva lavora su una metà dell'array spezzato, l'altra lavora sull'altra metà e questo finche non si arriva ad isolare tutti gli elementi dellarray, ma come fa la funzione di "fusione" ad ordinare il ordine crescente l'array?
16/07/2018, 09:36
16/07/2018, 10:57
Cos'è il VLA? Se ti riferisci al fatto che ci sono due array con indici non costanti, allora sì, me ne sono accorto
Allora provo a spiegarmi meglio: cominciamo dalla funzione mergeSort:
la prima istruzione divide l'array a metà, la seconda istruzione è il richiamo alla funzione stessa e divide a metà la prima metà dell'array finchè non arriva ad un'unica cella indivisibile, ma di queste uniche celle ce ne sono tante. La seconda istruzione è la chiamata alla funzione stessa che però va a dividere l'altra metà dell'array finchè non rimangono tante celle separate. A quel punto viene chiamata la funzione merge ed è qui che non capisco: la funzione merge deve unire tutte le celle in un array allocato dinamicamente, ma come fà a farlo in ordine. Oppure sono le istruzioni ricorsive che hanno diviso in ordine l'array?
16/07/2018, 11:09
16/07/2018, 11:46
Ecco ora abbiamo due caselle separate: il 7 e il 6, come fa la funzione che li unisce a prenderli correttamente in ordine crescente?
16/07/2018, 12:22
In pratica la funzione merge() si aspetta due partizioni ordinate
16/07/2018, 13:00
la funzione merge prende le parti già ordinate, ma chi è che le ordina?
Non è che hai frainteso il significato delle variabili? s sta per sinistra ovvero il primo elemento dell'array, c sta per centro a indicare la meta dell'array e d sta per destra a indicare l'ultimo elemento dell'array.
dopo la chiamata a funzione merge() con s=0, c=0 e d=1, l'array diventa
6 7 5 4 3 2 1
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.
Powered by phpBB © phpBB Group - Privacy policy - Cookie privacy
phpBB Mobile / SEO by Artodia.