MergeSort - исправить код - C (СИ)
Формулировка задачи:
Доброго времени суток!
Коротко о проблеме. После ознакомления с кодом в Вики и на различных форумах я склепал свой. Но ошыбки мне починить не удалось Я создаю массив, инициализирую его и делаю процедуру mergesort(). Первый аргумент ето входной массив, за ним идет отсортированый, далее левая и правая граница. Собственно проблема в нем Помогите пожалуста!
Скрин консоли после вывода массива:
Исправил код.
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- void mergesort (int*, int*, int, int);
- void main ()
- {
- int* input;
- int* output = (int*) calloc (11 , sizeof(int));
- int i;
- int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
- input = mas;
- mergesort (input, output, 0, 9);
- for (i = 0; i < 10; i++)
- {
- printf ("%d ", output[i]);
- printf ("%d \n", input[i]);
- }
- _getch();
- }
- void mergesort (int* input, int* output, int left, int right)
- {
- if (right - left < 1)
- return;
- else
- {
- int i;
- int l, r;
- int mid = (left + right) / 2;
- mergesort (input, output, left, mid);
- mergesort (input, output, mid + 1, right);
- // mergesort();
- l = left;
- r = mid + 1;
- /*for (i = left; i < right; i++)
- {
- /*if (r <= right || (l <= mid && input[l] <= input[r]))
- output[i] = input[l++];
- else
- output[i] = input[r++];*/
- i = left;
- int k;
- while ((l <= mid) && (r <= right))
- {
- if (input[l] <= input[r])
- output[i++] = input[l++];
- else
- output[i++] = input[r++];
- }
- if (l > mid)
- for (k = r; k <= right; k++)
- output[i++] = input[k++];
- else for (k = l; k <= mid; k++)
- output[i++] = input[k++];
- for (k = left; k < right; k++)
- input[k] = output[k];
- // }
- }
- }
Апдейт.
Немного изменил код и вот что из етого получилось.
Первый этап обработки исключения в "0x0028160f" в "diskret.exe": 0xC0000005: Нарушение прав доступа при чтении "0x001e0000".
Необработанное исключение в "0x777415ee" в "diskret.exe": 0xC0000005: Нарушение прав доступа при чтении "0x001e0000".
Программа "[4176] diskret.exe: Машинный код" завершилась с кодом -1073741819 (0xc0000005).
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- void mergesort (int*, int*, int, int);
- void main ()
- {
- int* input;
- int* output = (int*) calloc (11 , sizeof(int));
- int i;
- int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
- input = mas;
- mergesort (input, output, 0, 9);
- for (i = 0; i < 10; i++)
- {
- printf ("%d ", output[i]);
- printf ("%d \n", input[i]);
- }
- _getch();
- }
- void mergesort (int* input, int* output, int left, int right)
- {
- if (right - left < 1)
- return;
- else
- {
- int i;
- int l, r;
- int mid = (left + right) / 2;
- mergesort (input, output, left, mid);
- mergesort (input, output, mid + 1, right);
- // mergesort();
- l = left;
- r = mid + 1;
- for (i = left; i < right; i++)
- {
- if ((l < mid + 1 && r > right) || input[l] <= input[r])
- output[i] = input[l++];
- else
- output[i] = input[r++];
- i = left;
- int k;
- /*while ((l <= mid) && (r <= right))
- {
- if (input[l] <= input[r])
- output[i++] = input[l++];
- else
- output[i++] = input[r++];
- }
- if (l > mid)
- for (k = r; k <= right; k++)
- output[i++] = input[k++];
- else for (k = l; k <= mid; k++)
- output[i++] = input[k++];*/
- for (k = left; k < right; k++)
- input[k] = output[k];
- }
- }
- }
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- void mergesort (int*, int*, int, int);
- void main ()
- {
- int* input;
- int* output = (int*) calloc (11 , sizeof(int));
- int i;
- int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
- input = mas;
- mergesort (input, output, 0, 9);
- for (i = 0; i < 10; i++)
- {
- printf ("%d ", output[i]);
- printf ("%d \n", input[i]);
- }
- _getch();
- }
- void mergesort (int* input, int* output, int left, int right)
- {
- if (right - left < 1)
- return;
- else
- {
- int i;
- int l, r;
- int mid = (left + right) / 2;
- mergesort (input, output, left, mid);
- mergesort (input, output, mid + 1, right);
- // mergesort();
- l = left;
- r = mid + 1;
- /* for (i = left; i < right; i++)
- {
- if ((l < mid + 1 && r > right) || input[l] <= input[r])
- {
- output[i] = input[l];
- l++;
- }
- else
- {
- output[i] = input[r];
- r++;
- }*/
- i = left;
- int k;
- while ((l <= mid) && (r <= right))
- {
- if (input[l] <= input[r])
- {
- output[i++] = input[l];
- l++;
- }
- else
- {
- output[i++] = input[r++];
- r++;
- }
- }
- if (l > mid)
- for (k = r; k <= right; k++)
- output[i++] = input[k];
- else for (k = l; k <= mid; k++)
- output[i++] = input[k];
- for (k = left; k < right; k++)
- input[k] = output[k];
- }
- }
Решение задачи: «MergeSort - исправить код»
textual
Листинг программы
- /* ANSI C 99 */
- #include <stdio.h>
- #include <string.h>
- void dump(const int * arr, size_t count) {
- while ( count-- )
- printf("%d%c", *arr++, ( count ) ? ' ' : '\n');
- }
- void merge(const int * arrA, size_t cntA, const int * arrB, size_t cntB, int * arrC) {
- if ( cntA ) {
- if ( cntB ) {
- if ( *arrB < *arrA ) {
- *arrC++ = *arrB++;
- --cntB;
- }
- else {
- *arrC++ = *arrA++;
- --cntA;
- }
- merge(arrA, cntA, arrB, cntB, arrC);
- }
- else {
- while ( cntA-- )
- *arrC++ = *arrA++;
- }
- }
- else {
- while ( cntB-- )
- *arrC++ = *arrB++;
- }
- }
- int * merge_sort(int * arr, size_t count) {
- if ( count > 1 ) {
- int buf[count];
- merge(merge_sort(arr, count / 2), count / 2, merge_sort(arr + count / 2, count - count / 2), count - count / 2, buf);
- return memcpy(arr, buf, sizeof(int) * count);
- }
- else
- return arr;
- }
- #define COUNT (10)
- int main(void) {
- int arr[COUNT] = { 5, 3, 8, 0, 7, 9, 1, 2, 6, 4 };
- printf("Unsorted:\n");
- dump(arr, COUNT);
- printf("Sorted:\n");
- dump(merge_sort(arr, COUNT), COUNT);
- return 0;
- }
Объяснение кода листинга программы
Код реализует алгоритм сортировки Merge Sort
.
- В функции
dump
происходит вывод массива на экран. Принимает указатель на массив и количество элементов в массиве. Использует форматированный вывод для отделения элементов друг от друга пробелами или переносом строки в зависимости от количества оставшихся элементов. - В функции
merge
происходит слияние двух отсортированных массивов в один. Принимает указатель на первый массив, количество элементов в первом массиве, указатель на второй массив, количество элементов во втором массиве и указатель на результирующий массив. Если в массивах остаются элементы, то рекурсивно вызывается функцияmerge
для сортировки этих элементов. Если один из массивов пуст, то все оставшиеся элементы копируются в результирующий массив. - В функции
merge_sort
происходит сортировка массива с помощью алгоритмаMerge Sort
. Принимает указатель на массив и количество элементов в массиве. Если количество элементов больше 1, то массив разбивается на две равные части, каждая из которых сортируется рекурсивно, затем эти части объединяются с помощью функцииmerge
. Если количество элементов равно 1, то возвращается сам массив. - В функции
main
создаётся тестовый массив, выводится его исходное состояние, затем вызывается функцияmerge_sort
для сортировки массива и выводится отсортированный массив.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д