Opened 5 years ago
Closed 5 years ago
#320 closed ожидается проверка (задача сдана)
WW #4
Reported by: | sukhodolskiy.maksim | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_mergesort | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (3)
comment:1 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Можно было бы избежать дублирования строки
"Error: memory allocation failed.\n" (вынести ее в именованную константу)
В mergesort: контракт assert(elements > 0);
не выполняется, если запустить на тесте "char" программа падает по ассерту.
9 *(char *) (destination + i) = *(char *) (source + i);
некорректно: https://stackoverflow.com/a/3524270
(у Вас destination и source - void* , порядок операций должен быть другой:
*((char *) destination) + i) = *((char *) source) + i);
73 long long mem_size = 1ll * (elements + 1) * element_size;
лучше сделать так
73 long long mem_size = (elements + 1ll) * element_size;
но это все равно не соответствует Стандарту:
size_t может (и часто будет) совпадать с типом uint_64_t, так что от такого преобразования только хуже (UB: переполнение знакового типа). Отсутcтвие переполнение корректно проверяется иначе: SIZE_MAX / element_size > elements
84 for (size_t i = 0; i < elements - 1; i++) { 85 int is_bigger = comparator(array + i * element_size, array + (i + 1) * element_size); 86 assert(is_bigger <= 0); 87 }
стоило бы вынести в отдельную функцию. Тогда в release сборке он бы вырезался целиком, а так останутся бесполезные операции.
реализацию merge можно упростить, оставив один while (!(i == m - l && j == r - m)). Придется добавить условий внутрь цикла, зато не будет дублирования кода.
дублирования остались (6 одинаковых вызовов my_memcpy), цель не достигнута
Лайк за 1 аллокацию на весь mergesort.
Больше внимания проверке контрактов! Указатели ненулевые везде, не так ли?
comparator != NULL? element_size == 0 допустим? что, если (elements + 1) * element_size переполняется? еще пост-условие можно проверить (массив отсортирован)э
Чем мотивирован выбор типа?
50 int m = (l + r) / 2;
memcpy по условию запрещен.
Бонус: exit(1) запрещен.
Чем мотивирован "return -1" из main?
реализацию merge можно упростить, оставив один while (!(i == m - l && j == r - m)). Придется добавить условий внутрь цикла, зато не будет дублирования кода.