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");
}
C/C++
Помогите разобраться с тем, как работает код
Это сортировка слиянием методом Боуза — Нельсона.
1. Массив делится пополам — на левую и правую половины.
3. Производится слияние отсортированных подмассивов.
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
Это не код, а исходный текст.
Как разбираются с тем, как работает код, читаем в книге "Способ мышления - дизассемблер IDA"
Как разбираются с тем, как работает код, читаем в книге "Способ мышления - дизассемблер IDA"
Темур Назаров
Но заметим, что попытка компиляции завершилась четырьмя ошибками, то есть правильный ответ - ваша программа вообще не работает.
Похожие вопросы
- Помогите разобраться в коде функций C++
- Помогите разобраться с кодом. На основании чего происходит приоритет перемножения матриц
- Не работает код с++
- Почему не работает код?
- Не работает код
- Не работает код на с++
- Не работает код
- Не работает код на c++
- Не работает код на c++
- Помогите разобраться с массивами С++