Возникает ошибка с некорректным значением переменной size, которую вводит пользователь
Пишу программу для плавной сортировки (Smoothsort) на С++.
За основную функцию не переживаю, она написанна правильно.
Появилась проблема, что моя переменная int size
во время компиляции получает неккоретное значение.
Вот код программы на С++ и фотография дебаггера от VSCode.
#include <iostream>
// Модификация сортировки кучей. Вместо двоичной кучи используем K-ую кучу Леонардо.
void smoothsort(int *arr, int size)
{
int p = 1; // индекс в массиве (p = r + b) (r = q & ~b) (q = p & ~b)
int q = 1; // битовая маска (q = p & ~b) (b = q & ~c) (c = b << 1)
int r = 0; // индекс в массиве (r = q & ~b) (q = p & ~b) (b = q & ~c)
int b = 1; // битовая маска (b = q & ~c) (c = b << 1) (p = r + b)
int c = 1; // битовая маска (c = b << 1) (b = q & ~c) (p = r + b)
while (p < size) // Построение кучи Леонардо
{
if ((p & q) == 0) // Поддержание свойства кучи Леонардо
{
if (p + 1 != size && arr[p] < arr[p + 1]) // Поддержание свойства кучи Леонардо
{
p++;
q |= p;
}
if (r != 0)
{
b = c = r;
}
r = p;
}
else
{
if (arr[p] < arr[p - 1])
{
std::swap(arr[p], arr[p - 1]);
if (r != 0)
{
p = r;
r = 0;
}
else
{
p--;
q &= ~p;
}
}
else
{
if (r != 0)
{
p = r;
r = 0;
}
else
{
p--;
q &= ~p;
}
}
}
p += b;
q >>= 1;
c -= b;
b <<= 1;
}
while (c != 1)
{
c >>= 1;
b >>= 1;
p -= b;
q |= p;
if ((q & c) != 0)
{
if (arr[p] < arr[p - c])
{
std::swap(arr[p], arr[p - c]);
int t = c;
while (t <= b)
{
c = t;
t <<= 1;
}
}
}
}
}
// заправшиваем размер массива
// просим ввести элементы массива
// выводим введенный массив
// вызываем функцию сортировки
// выводим отсортированный массив
int main()
{
int size;
std::cout << "Введите размер массива: ";
std::cin >> size;
int arr[size];
std::cout << "Введите элементы массива: \n";
for (int i = 0; i < size; i++)
{
std::cin >> arr[i];
}
std::cout << "Начальный массив: ";
for (int i = 0; i < size; i++)
{
std::cout << arr[i] << " ";
}
smoothsort(arr, size);
std::cout << "\nОтсортированный массив: ";
for (int i = 0; i < size; i++)
{
std::cout << arr[i] << " ";
}
std::cout << "\n";
}
Источник: Stack Overflow на русском