MergeSort - исправить код - C (СИ)

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

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

Доброго времени суток! Коротко о проблеме. После ознакомления с кодом в Вики и на различных форумах я склепал свой. Но ошыбки мне починить не удалось Я создаю массив, инициализирую его и делаю процедуру mergesort(). Первый аргумент ето входной массив, за ним идет отсортированый, далее левая и правая граница. Собственно проблема в нем Помогите пожалуста!
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. void mergesort (int*, int*, int, int);
  5. void main ()
  6. {
  7. int* input;
  8. int* output = (int*) calloc (11 , sizeof(int));
  9. int i;
  10. int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
  11. input = mas;
  12. mergesort (input, output, 0, 9);
  13. for (i = 0; i < 10; i++)
  14. {
  15. printf ("%d ", output[i]);
  16. printf ("%d \n", input[i]);
  17. }
  18. _getch();
  19. }
  20. void mergesort (int* input, int* output, int left, int right)
  21. {
  22. if (right - left < 1)
  23. return;
  24. else
  25. {
  26. int i;
  27. int l, r;
  28. int mid = (left + right) / 2;
  29. mergesort (input, output, left, mid);
  30. mergesort (input, output, mid + 1, right);
  31. // mergesort();
  32. l = left;
  33. r = mid + 1;
  34. /*for (i = left; i < right; i++)
  35. {
  36. /*if (r <= right || (l <= mid && input[l] <= input[r]))
  37. output[i] = input[l++];
  38. else
  39. output[i] = input[r++];*/
  40. i = left;
  41. int k;
  42. while ((l <= mid) && (r <= right))
  43. {
  44. if (input[l] <= input[r])
  45. output[i++] = input[l++];
  46. else
  47. output[i++] = input[r++];
  48. }
  49. if (l > mid)
  50. for (k = r; k <= right; k++)
  51. output[i++] = input[k++];
  52. else for (k = l; k <= mid; k++)
  53. output[i++] = input[k++];
  54. for (k = left; k < right; k++)
  55. input[k] = output[k];
  56. // }
  57. }
  58. }
Скрин консоли после вывода массива:
Апдейт. Немного изменил код и вот что из етого получилось. Первый этап обработки исключения в "0x0028160f" в "diskret.exe": 0xC0000005: Нарушение прав доступа при чтении "0x001e0000". Необработанное исключение в "0x777415ee" в "diskret.exe": 0xC0000005: Нарушение прав доступа при чтении "0x001e0000". Программа "[4176] diskret.exe: Машинный код" завершилась с кодом -1073741819 (0xc0000005).
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. void mergesort (int*, int*, int, int);
  5. void main ()
  6. {
  7. int* input;
  8. int* output = (int*) calloc (11 , sizeof(int));
  9. int i;
  10. int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
  11. input = mas;
  12. mergesort (input, output, 0, 9);
  13. for (i = 0; i < 10; i++)
  14. {
  15. printf ("%d ", output[i]);
  16. printf ("%d \n", input[i]);
  17. }
  18. _getch();
  19. }
  20. void mergesort (int* input, int* output, int left, int right)
  21. {
  22. if (right - left < 1)
  23. return;
  24. else
  25. {
  26. int i;
  27. int l, r;
  28. int mid = (left + right) / 2;
  29. mergesort (input, output, left, mid);
  30. mergesort (input, output, mid + 1, right);
  31. // mergesort();
  32. l = left;
  33. r = mid + 1;
  34. for (i = left; i < right; i++)
  35. {
  36. if ((l < mid + 1 && r > right) || input[l] <= input[r])
  37. output[i] = input[l++];
  38. else
  39. output[i] = input[r++];
  40. i = left;
  41. int k;
  42. /*while ((l <= mid) && (r <= right))
  43. {
  44. if (input[l] <= input[r])
  45. output[i++] = input[l++];
  46. else
  47. output[i++] = input[r++];
  48. }
  49. if (l > mid)
  50. for (k = r; k <= right; k++)
  51. output[i++] = input[k++];
  52. else for (k = l; k <= mid; k++)
  53. output[i++] = input[k++];*/
  54. for (k = left; k < right; k++)
  55. input[k] = output[k];
  56. }
  57. }
  58. }
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. void mergesort (int*, int*, int, int);
  5. void main ()
  6. {
  7. int* input;
  8. int* output = (int*) calloc (11 , sizeof(int));
  9. int i;
  10. int mas[] = {4, 2, 7, 5, 1, 0, 3, 6, 8, 9};
  11. input = mas;
  12. mergesort (input, output, 0, 9);
  13. for (i = 0; i < 10; i++)
  14. {
  15. printf ("%d ", output[i]);
  16. printf ("%d \n", input[i]);
  17. }
  18. _getch();
  19. }
  20. void mergesort (int* input, int* output, int left, int right)
  21. {
  22. if (right - left < 1)
  23. return;
  24. else
  25. {
  26. int i;
  27. int l, r;
  28. int mid = (left + right) / 2;
  29. mergesort (input, output, left, mid);
  30. mergesort (input, output, mid + 1, right);
  31. // mergesort();
  32. l = left;
  33. r = mid + 1;
  34. /* for (i = left; i < right; i++)
  35. {
  36. if ((l < mid + 1 && r > right) || input[l] <= input[r])
  37. {
  38. output[i] = input[l];
  39. l++;
  40. }
  41. else
  42. {
  43. output[i] = input[r];
  44. r++;
  45. }*/
  46. i = left;
  47. int k;
  48. while ((l <= mid) && (r <= right))
  49. {
  50. if (input[l] <= input[r])
  51. {
  52. output[i++] = input[l];
  53. l++;
  54. }
  55. else
  56. {
  57. output[i++] = input[r++];
  58. r++;
  59. }
  60. }
  61. if (l > mid)
  62. for (k = r; k <= right; k++)
  63. output[i++] = input[k];
  64. else for (k = l; k <= mid; k++)
  65. output[i++] = input[k];
  66. for (k = left; k < right; k++)
  67. input[k] = output[k];
  68. }
  69. }
Исправил код.

Решение задачи: «MergeSort - исправить код»

textual
Листинг программы
  1. /* ANSI C 99 */
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. void dump(const int * arr, size_t count) {
  6.     while ( count-- )
  7.         printf("%d%c", *arr++, ( count ) ? ' ' : '\n');
  8. }
  9.  
  10. void merge(const int * arrA, size_t cntA, const int * arrB, size_t cntB, int * arrC) {
  11.     if ( cntA ) {
  12.         if ( cntB ) {
  13.             if ( *arrB < *arrA ) {
  14.                 *arrC++ = *arrB++;
  15.                 --cntB;
  16.             }
  17.             else {
  18.                 *arrC++ = *arrA++;
  19.                 --cntA;
  20.             }
  21.             merge(arrA, cntA, arrB, cntB, arrC);
  22.         }
  23.         else {
  24.             while ( cntA-- )
  25.                 *arrC++ = *arrA++;
  26.         }
  27.     }
  28.     else {
  29.         while ( cntB-- )
  30.             *arrC++ = *arrB++;
  31.     }
  32. }
  33.  
  34. int * merge_sort(int * arr, size_t count) {
  35.     if ( count > 1 ) {
  36.         int buf[count];
  37.         merge(merge_sort(arr, count / 2), count / 2, merge_sort(arr + count / 2, count - count / 2), count - count / 2, buf);
  38.         return memcpy(arr, buf, sizeof(int) * count);
  39.     }
  40.     else
  41.         return arr;
  42. }
  43.  
  44. #define COUNT (10)
  45.  
  46. int main(void) {
  47.     int arr[COUNT] = { 5, 3, 8, 0, 7, 9, 1, 2, 6, 4 };
  48.    
  49.     printf("Unsorted:\n");
  50.     dump(arr, COUNT);
  51.     printf("Sorted:\n");
  52.     dump(merge_sort(arr, COUNT), COUNT);
  53.    
  54.     return 0;
  55. }

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

Код реализует алгоритм сортировки Merge Sort.

  1. В функции dump происходит вывод массива на экран. Принимает указатель на массив и количество элементов в массиве. Использует форматированный вывод для отделения элементов друг от друга пробелами или переносом строки в зависимости от количества оставшихся элементов.
  2. В функции merge происходит слияние двух отсортированных массивов в один. Принимает указатель на первый массив, количество элементов в первом массиве, указатель на второй массив, количество элементов во втором массиве и указатель на результирующий массив. Если в массивах остаются элементы, то рекурсивно вызывается функция merge для сортировки этих элементов. Если один из массивов пуст, то все оставшиеся элементы копируются в результирующий массив.
  3. В функции merge_sort происходит сортировка массива с помощью алгоритма Merge Sort. Принимает указатель на массив и количество элементов в массиве. Если количество элементов больше 1, то массив разбивается на две равные части, каждая из которых сортируется рекурсивно, затем эти части объединяются с помощью функции merge. Если количество элементов равно 1, то возвращается сам массив.
  4. В функции main создаётся тестовый массив, выводится его исходное состояние, затем вызывается функция merge_sort для сортировки массива и выводится отсортированный массив.

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


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

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

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

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

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

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