codice:
void merge(int lista[ ][ITERAZIONI][DIMENSIONE_MAX_LISTA], int ordinata[ ][ITERAZIONI][DIMENSIONE_MAX_LISTA], int i, int m, int n, int z, int r)
{
/* fonde due file ordinati: lista[i],...,lista[m]
e lista[m+1],...,lista[n], per ottenere una sola lista ordinata
ordinata[i],...,ordinata[n]
*/ printf(" 1 ");
int j, k, t;
j = m+1;
// indice per la seconda lista
k = i;
printf(" 2 ");
// indice per la lista ordinata
while(i<=m && j<=n)
{ printf(" 3 ");
if(lista[z][r][i]<=lista[z][r][j]) ordinata[z][r][k++] = lista[z][r][i++];
else
ordinata[z][r][k++] = lista[z][r][j++];
}
printf(" 4 ");
if(i>m) for(t=j; t<=n; t++) ordinata[z][r][k+t-j] = lista[z][r][t];
// ordinata[k],...,ordinata[n] = lista[j],...,lista[n]
else for(t=i; t<=m; t++) ordinata[z][r][k+t-i] = lista[z][r][t];
// ordinata[k],...,ordinata[n] = lista[i],...,lista[m]
printf(" 5 ");
}
void passo_merge(int lista[ ][ITERAZIONI][DIMENSIONE_MAX_LISTA], int ordinata[][ITERAZIONI][DIMENSIONE_MAX_LISTA], int n, int lungh,int z, int r)
{
/*
Svolge un passo dell'ordinamento per fusione.
Fonde una coppia di sottofile adiacenti da lista a ordinata;
n è il numero di elementi nella lista;
lungh è la lunghezza del sottofile */
int i, j;
printf(" A ");
for(i = 0; i <= n-2*lungh; i += 2*lungh)
merge(lista, ordinata, i, i+lungh-1, i+2*lungh-1, z, r);
printf(" B ");
if(i+lungh < n)
merge(lista, ordinata, i, i+lungh-1, n-1, z, r);
else for(j = i; j < n; j++)
ordinata[z][r][j] = lista[z][r][j];
printf(" C ");
}
void mergesort(int lista[ ][ITERAZIONI][DIMENSIONE_MAX_LISTA], int n, int z, int r)
{
printf(" a ");
/* ordina la lista lista[0],...,lista[n-1] per fusione */
int lungh = 1;
printf(" b ");
// lunghezza corrente delle liste da fondere
printf(" c ");
int extra[MAX][ITERAZIONI][DIMENSIONE_MAX_LISTA];
printf(" d ");
while(lungh < n)
{
printf(" e ");
passo_merge(lista, extra, n, lungh, z, r);
printf(" f ");
lungh *= 2;
printf(" g ");
passo_merge(extra, lista, n, lungh, z, r);
printf(" h ");
lungh *= 2;
printf(" a ");
}
}