Нерекурсивная сортировка слиянием работает с учетом размеров окна 1,2,4,8,16..2 ^ n над входным массивом. Для каждого окна ('k' в коде ниже) все смежные пары окон объединяются во временное пространство, а затем помещаются обратно в массив.
Вот моя единственная функция, основанная на C, нерекурсивная сортировка слиянием.
Вход и выход находятся в «а». Временное хранение в «б».
Однажды я хотел бы иметь версию, которая была на месте:
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 (n log n). Внешний цикл по размеру окна увеличивается как степень двух, поэтому k имеет log n итераций. Хотя существует много окон, охватываемых внутренним циклом, все окна для данного k точно покрывают входной массив, поэтому внутренний цикл равен O (n). Объединение внутреннего и внешнего циклов: O (n) * O (log n) = O (n log n).