Olá Rafa tudo bem ?
Que linguagem estás a utilizar ??
Se for c ou numa das suas derivantes para fazeres merge sort não recursivo segue o seguinte código
float a[50000000],b[50000000];
void mergesort (long num)
{
int rght, wid, rend;
int i,j,m,t;
for (int k=1; k < num; k *= 2 ) {
for (int left=0; left+k < num; left += k*2 ) {
rght = left + k;
rend = rght + k;
if (rend > num) rend = num;
m = left; i = left; j = rght;
while (i < rght && j < rend) {
if (a[i] <= a[j]) {
b[m] = a[i]; i++;
} else {
b[m] = a[j]; j++;
}
m++;
}
while (i < rght) {
b[m]=a[i];
i++; m++;
}
while (j < rend) {
b[m]=a[j];
j++; m++;
}
for (m=left; m < rend; m++) {
a[m] = b[m];
}
}
}
}
O tipo de intercalação não recursiva funciona considerando os tamanhos de janela de 1,2,4,8,16 ... 2 ^ n sobre a matriz de entrada. Para cada janela ('k'), todos os pares adjacentes de janelas são misturados num espaço temporário e, em seguida, colocados de volta na matriz.
Entrada e saída estão em 'a'.
Armazenamento temporário em 'b'.
Caso não seja a linguagem c que estas a utilizar nem nenhuma das suas derivantes, se for java por exemplo podes sempre adaptar basta mudar a sintaxe de algumas instruções ...
Espero que tenha ajudado
Abraço
Vítor Mendes