Сортировка слиянием (merge sort), ошибка в динамической аллокации - C (СИ)
Формулировка задачи:
Уважаемые,
помогите, пожалуйста, разобраться. Задача 1 заключается в реализации сортировки слиянием (рекурсия).
Тест 1 выдаёт, что код компилируется с С99 без предупреждений и отвечает формальным критериям.
А тест 2 выдаёт ошибку динамической аллокации
Причем, что интересно, с использованием такого же содержания функции merge для 2 задания (реализация итеративной сортировки слиянием) тест 2 проходит без ошибки.
Код для 1(рекурсивной) задачи:
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
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- void merge(int* array, int start, int middle, int end)
- {
- int *arrayB =(int*) malloc(sizeof(end-start+2));
- int k = start;
- int m = middle +1;
- int i = 1;
- int j = 1;
- while(k<=middle && m <=end){
- if(array[k]<=array[m]){
- arrayB[i] = array[k];
- k++;
- }
- else{
- arrayB[i] = array[m];
- m++;
- }
- i++;
- }
- while(k<=middle){
- arrayB[i] = array[k];
- k++;
- i++;
- }
- while(m<= end){
- arrayB[i] = array[m];
- m++;
- i++;
- }
- while(j<i){
- array[start+j-1] = arrayB[j];
- j++;
- }
- free(arrayB);
- return;
- }
- void merge_sort(int* array, int first, int last)
- {
- if(first<last){
- int middle = (first+last)/2;
- merge_sort(array, first, middle);
- merge_sort(array, middle+1, last);
- merge(array, first, middle, last);
- }
- }
- int main (int argc, char *argv[])
- {
- if (argc!=3){
- printf ("usage: %s <maximale anzahl> <dateipfad>\n", argv[0]);
- exit(2);
- }
- char *filename = argv[2];
- int *array;
- int size = atoi(argv[1]);
- array = malloc((size)*sizeof(int));
- int len = read_array_from_file(array, atoi(argv[1]), filename);
- printf("Eingabe:\n");
- print_array(array, len);
- // HIER Aufruf von "merge_sort()"
- merge_sort(array, 0, len);
- printf("Sortiert:\n");
- print_array(array, len);
- free(array);
- return 0;
- }
Решение задачи: «Сортировка слиянием (merge sort), ошибка в динамической аллокации»
textual
Листинг программы
- int *arrayB =(int*)malloc(sizeof(int) * (end-start+2))
Объяснение кода листинга программы
В данном коде выполняется сортировка слиянием (merge sort) массива. Вот список действий, которые происходят в коде:
- Выделение памяти под массив
arrayB
с помощью функции malloc.- Указатель
arrayB
будет указывать на начало блока памяти. - Размер блока памяти вычисляется как разница между
end
иstart
, увеличенная на 2 (для включения в массив обоих границ). - Присваивание типа int* для переменной
arrayB
. - Преобразование типа int в int* для переменной
arrayB
. Код после выполнения этих действий будет готов к выполнению сортировки слиянием.
- Указатель
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д