Задача такая, реализовать алгоритм сортировки слияния, прочитав варианты реализации на других сайтах и версию вики, реализация показалась мне довольно громоздкой и не совсем элегантной, в собственной версии поставил себе задачу: – Выполнить рекурсивно. – Одной функцией. – Уменьшить число операнд. – Свести количество параметров до передаваемого в функцию указателя на массив и размера самого массива. После некоторых преобразований свел код, до ниже представленного, компилируется с ошибкой “stuck overflow: обращение к запрещенному участку памяти”, или “нарушение прав доступа при чтении по адресу..”. Долгое время не могу найти утечку и прошу кого-либо более внимательного заметить и сказать мне, где именно происходит выход за пределы массива в данном коде:
void merge_sort(int* unsorted, unsigned int size) { if (size < 2) return; int middle = size >> 1; merge_sort(unsorted, middle); merge_sort(unsorted + middle, size - middle); int* first = unsorted; int* second = unsorted + middle; int* sorted = new int[size]; while (first != (unsorted + middle) || second != (unsorted + size)) { std::cout << *first << '\t' << *second << std::endl; *sorted++ = *first < *second ? *first++ : *second++; } while (first != (unsorted + middle)) *sorted++ = *first++; while (second != (unsorted + middle)) *sorted++ = *second++; while (sorted != (sorted - size)) *(unsorted-- + size) = *sorted--; delete[] sorted; }