Сортировка слиянием (merge sort), ошибка в динамической аллокации - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Уважаемые, помогите, пожалуйста, разобраться. Задача 1 заключается в реализации сортировки слиянием (рекурсия). Тест 1 выдаёт, что код компилируется с С99 без предупреждений и отвечает формальным критериям. А тест 2 выдаёт ошибку динамической аллокации
2015-12-17T22:44:11.883304922Z [ INFO] TEST 2: Check Calls: Recursion and dynamic memory 2015-12-17T22:44:11.889112824Z [ INFO] ----------------------------------------------------------------------- [INFO] Check: Recursion [INFO] Check: (c|m)allocs [ERROR] No malloc or calloc found! [INFO] TERMINATION TIME: > Thu Dec 17 23:44:11 CET 2015 2015-12-17T22:44:11.955008007Z [INFO] > RESULT: FAILED
Причем, что интересно, с использованием такого же содержания функции merge для 2 задания (реализация итеративной сортировки слиянием) тест 2 проходит без ошибки. Код для 1(рекурсивной) задачи:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. void merge(int* array, int start, int middle, int end)
  5. {
  6. int *arrayB =(int*) malloc(sizeof(end-start+2));
  7. int k = start;
  8. int m = middle +1;
  9. int i = 1;
  10. int j = 1;
  11. while(k<=middle && m <=end){
  12. if(array[k]<=array[m]){
  13. arrayB[i] = array[k];
  14. k++;
  15. }
  16. else{
  17. arrayB[i] = array[m];
  18. m++;
  19. }
  20. i++;
  21. }
  22. while(k<=middle){
  23. arrayB[i] = array[k];
  24. k++;
  25. i++;
  26. }
  27. while(m<= end){
  28. arrayB[i] = array[m];
  29. m++;
  30. i++;
  31. }
  32. while(j<i){
  33. array[start+j-1] = arrayB[j];
  34. j++;
  35. }
  36. free(arrayB);
  37. return;
  38. }
  39. void merge_sort(int* array, int first, int last)
  40. {
  41. if(first<last){
  42. int middle = (first+last)/2;
  43. merge_sort(array, first, middle);
  44. merge_sort(array, middle+1, last);
  45. merge(array, first, middle, last);
  46. }
  47. }
  48.  
  49. int main (int argc, char *argv[])
  50. {
  51. if (argc!=3){
  52. printf ("usage: %s <maximale anzahl> <dateipfad>\n", argv[0]);
  53. exit(2);
  54. }
  55. char *filename = argv[2];
  56.  
  57. int *array;
  58. int size = atoi(argv[1]);
  59. array = malloc((size)*sizeof(int));
  60.  
  61. int len = read_array_from_file(array, atoi(argv[1]), filename);
  62. printf("Eingabe:\n");
  63. print_array(array, len);
  64. // HIER Aufruf von "merge_sort()"
  65. merge_sort(array, 0, len);
  66. printf("Sortiert:\n");
  67. print_array(array, len);
  68. free(array);
  69. return 0;
  70. }

Решение задачи: «Сортировка слиянием (merge sort), ошибка в динамической аллокации»

textual
Листинг программы
  1. int *arrayB =(int*)malloc(sizeof(int) * (end-start+2))

Объяснение кода листинга программы

В данном коде выполняется сортировка слиянием (merge sort) массива. Вот список действий, которые происходят в коде:

  1. Выделение памяти под массив arrayB с помощью функции malloc.
    • Указатель arrayB будет указывать на начало блока памяти.
    • Размер блока памяти вычисляется как разница между end и start, увеличенная на 2 (для включения в массив обоих границ).
    • Присваивание типа int* для переменной arrayB.
    • Преобразование типа int в int* для переменной arrayB. Код после выполнения этих действий будет готов к выполнению сортировки слиянием.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут