Сортировка слиянием работает некорректно - C (СИ)

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

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

Здравствуйте! Читаю Алгоритмы. Построение и анализ. Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. Попытался реализовать на си, но не верно. Помогите, пожалуйста!
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #define COUNT 9
  6. void merge(int *arr, int p, int q, int r)
  7. {
  8. int i,j,k;
  9. int n1 = q - p;
  10. int n2 = r - q;
  11. int *larr = malloc(sizeof(int)*(n1+1));
  12. int *rarr = malloc(sizeof(int)*(n2+1));
  13. for( i = 0; i < n1; i++ )
  14. larr[i] = arr[p+i];
  15. for( j = 0; j < n2; j++ )
  16. rarr[j] = arr[q+j];
  17. larr[n1] = 999999;
  18. rarr[n2] = 999999;
  19. i = 0;
  20. j = 0;
  21. for( k = p; k < r; k++ ) {
  22. if( larr[i] <= rarr[j] && i < n1 )
  23. arr[k] = larr[i++];
  24. else
  25. arr[k] = rarr[j++];
  26. }
  27. free(larr);
  28. free(rarr);
  29. }
  30. void merge_sort( int *arr, int p, int r )
  31. {
  32. if( p < r ) {
  33. int q = (p+r)/2;
  34. merge_sort( arr, p, q );
  35. merge_sort( arr, q+1, r);
  36. merge(arr,p,q,r);
  37. }
  38. }
  39. int main( int argc, char ** argv )
  40. {
  41. int i,j;
  42. int array[COUNT];
  43. // заполнение случайными числами
  44. srand(time(NULL));
  45. for( i = 0; i < COUNT; i++ )
  46. array[i] = rand()%255;
  47. // вывод массива перед сортировкой
  48. for( i = 0; i < COUNT; i++ )
  49. printf("%d ", array[i]);
  50. // сортировка
  51. merge_sort( array, 0, COUNT );
  52. // вывод массива после сортировки
  53. printf("%c",'\n');
  54. for( i = 0; i < COUNT; i++ )
  55. printf("%d ", array[i]);
  56. return EXIT_SUCCESS;
  57. }

Решение задачи: «Сортировка слиянием работает некорректно»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5.  
  6. #define COUNT 9
  7.  
  8. void merge(int *arr, int p, int q, int r)
  9. {
  10.     int i,j,k;
  11.     int n1 = q - p;
  12.     int n2 = r - q;
  13.     int *larr,*rarr;
  14.  
  15.     if(n1==0 || n2==0)
  16.         return;
  17.  
  18.     larr = (int*)malloc(sizeof(int)*n1);
  19.     rarr = (int*)malloc(sizeof(int)*n2);
  20.  
  21.     for( i = 0; i < n1; i++ )
  22.         larr[i] = arr[p+i];
  23.     for( j = 0; j < n2; j++ )
  24.         rarr[j] = arr[q+j];
  25.  
  26.     i = 0;
  27.     j = 0;
  28.  
  29.     for( k = p; k < r; k++ ) {
  30.         if(j==n2 || ( i < n1 && larr[i] <= rarr[j]) )
  31.             arr[k] = larr[i++];
  32.         else
  33.             arr[k] = rarr[j++];
  34.     }
  35.     free(larr);
  36.     free(rarr);
  37. }
  38.  
  39. void merge_sort( int *arr, int p, int r )
  40. {
  41.     int q;
  42.     if( r-p > 1 ) {
  43.         q = (p+r)/2;
  44.         merge_sort( arr, p, q );
  45.         merge_sort( arr, q, r);
  46.         merge(arr,p,q,r);
  47.     }
  48. }
  49.  
  50. int main( int argc, char ** argv )
  51. {
  52.     int i;
  53.     int array[COUNT];
  54.  
  55.     // заполнение случайными числами
  56.     srand((unsigned)time(NULL));
  57.  
  58.     for( i = 0; i < COUNT; i++ )
  59.         array[i] = rand()%255;
  60.  
  61.     // вывод массива перед сортировкой
  62.     for( i = 0; i < COUNT; i++ )
  63.         printf("%d ", array[i]);
  64.  
  65.     // сортировка
  66.     merge_sort( array, 0, COUNT );
  67.  
  68.     // вывод массива после сортировки
  69.     printf("\n");
  70.     for( i = 0; i < COUNT; i++ )
  71.         printf("%d ", array[i]);   
  72.         return EXIT_SUCCESS;
  73. }

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

  1. Включаем необходимые заголовочные файлы
  2. Объявляем функцию merge, которая будет выполнять слияние массивов
  3. В функции merge определяем переменные i, j, k для работы с индексами массива
  4. Определяем переменные n1 и n2 для хранения размеров сортируемых массивов
  5. Выделяем память под массивы larr и rarr с помощью функции malloc
  6. Копируем элементы из исходного массива в larr и rarr
  7. Создаем временный массив arr для хранения отсортированных значений
  8. Сортируем элементы массива с помощью цикла for и условного оператора if
  9. Освобождаем память, выделенную под larr и rarr
  10. Объявляем функцию merge_sort, которая будет выполнять сортировку массива слиянием
  11. В функции merge_sort определяем переменную q для хранения индекса серединного элемента
  12. Проверяем условие для рекурсивного вызова функции merge_sort
  13. Рекурсивно вызываем функцию merge_sort для левой и правой половин массива
  14. Рекурсивно вызываем функцию merge_sort для правой и левой половин массива
  15. Вызываем функцию merge для слияния отсортированных половин массива
  16. В функции main создаем массив array типа int с длиной 9
  17. Заполняем массив случайными числами с помощью функции rand и srand
  18. Выводим массив на экран с помощью цикла for и функции printf
  19. Вызываем функцию merge_sort для сортировки массива array
  20. Выводим отсортированный массив на экран с помощью цикла for и функции printf
  21. Возвращаем успешный результат выполнения программы с помощью return EXIT_SUCCESS

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


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

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

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

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

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

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