Задача «Сортировка слиянием (произвольные массивы)»

Реализовать сортировку слиянием для произвольных массивов.

void mergesort(const void *ptr,
               size_t count, size_t size,
               int (*cmp)(const void *, const void *));

где:

  • ptr — указатель на начало массива,
  • count — количество элементов в массиве,
  • size — размер одного элемента,
  • cmp — функция сравнения, которая возвращает число больше нуля, если первый аргумент больше второго, число меньше нуля, если первый меньше второго, и ноль, если аргументы равны.

Функция выделяет ровно один раз ровно один дополнительный блок памяти (размером count*size) и использует его в качестве вспомогательного. В конце работы этот блок освобождается, а отсортированные данные оказываются внутри исходного массива.

Работу алгоритма протестировать с помощью assert. Особое внимание уделить краевым случаям: count=0, count=1. Дополнительно реализовать тест генерации случайных массивов случайного размера с сортировкой и последующей проверкой.