C/C++

Помогите разобраться с тем, как работает код

void merge(Plan stack[], int n)
{
int mid = n / 2;
if (n % 2 == 1)
mid++;
int h = 1; // шаг



Plan* c = (Plan*)malloc(n * sizeof(Plan));
int step;

while (h < n)
{
step = h;
int i = 0;
int j = mid;
int k = 0;

while (step <= mid)
{
while ((i < step) && (j < n) && (j < (mid + step)))
{
if (stack[i].gramm < stack[j].gramm)
{
c[k].gramm = stack[i].gramm;
i++; k++;
}
else {
c[k].gramm = stack[j].gramm;
j++; k++;
}
}

while (i < step)
{
c[k].gramm = stack[i].gramm;
i++; k++;
}

while ((j < (mid + step)) && (j < n))
{
c[k].gramm = stack[j].gramm;
j++; k++;
}

step = step + h;
}

h = h * 2;



for (i = 0; i < n; i++) {
stack[i].gramm = c[i].gramm;
}
}

for (int i = 0; i < n; ++i) {
printf("Name: %-10s gramm: %-10d kkal: %-10d\n", stack[i].name.c_str(), stack[i].gramm, stack[i].kkal);
}
system("pause");
}
Это сортировка слиянием методом Боуза — Нельсона.

1. Массив делится пополам — на левую и правую половины.
 int i = 0; 
int j = mid;
2. Элементы разбиваются на группы.
 step = h;  
На первой итерации это двойки элементов, по одному элементу из каждой половины (первый элемент левой половины и первый элемент правой половины, второй элемент левой половины и второй элемент правой половины и так далее).
 h = 1; 
На второй итерации — четвёрки элементов, по два элемента из каждой половины (первый и второй элементы левой половины и первый и второй элементы правой половины и так далее).
 h = h * 2; 
На третьей итерации — восьмёрки и так далее, пока размер группы меньше размера массива.
 while (h < n) 
Элементы каждой группы из левой половины являются отсортированным подмассивом, элементы каждой группы из правой половины также являются отсортированным подмассивом.

3. Производится слияние отсортированных подмассивов.
 while ((i < step) && (j < n) && (j < (mid + step)))  
if (stack[i].gramm < stack[j].gramm)
c[k++].gramm = stack[i++].gramm;
else
c[k++].gramm = stack[j++].gramm;

while (i < step)
c[k++].gramm = stack[i++].gramm;

while ((j < (mid + step)) && (j < n))
c[k++].gramm = stack[j++].gramm;
Для каждой группы.
 step = step + h; 
Пока группы не закончатся.
 while (step
Антон Лебедев
Антон Лебедев
12 091
Лучший ответ
Это не код, а исходный текст.
Как разбираются с тем, как работает код, читаем в книге "Способ мышления - дизассемблер IDA"
Темур Назаров
Темур Назаров
98 591
Темур Назаров Но заметим, что попытка компиляции завершилась четырьмя ошибками, то есть правильный ответ - ваша программа вообще не работает.