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

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

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

Восходящая сортировка слиянием массива. Метод слияния прямой.

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

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

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

  1. В функции merge происходит сортировка слиянием массивов srcA и srcB в массив dst.
  2. Если cntA больше cntB, то значит массив srcA больше массива srcB, и есть возможность, что в процессе сортировки элементы массива srcB будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массива srcA, а затем массива srcB.
  3. Если cntA меньше cntB, то значит массив srcA меньше массива srcB, и есть возможность, что в процессе сортировки элементы массива srcA будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массива srcB, а затем массива srcA.
  4. Если элементы srcA и srcB равны, то в dst записывается сначала элемент srcA, а затем элемент srcB.
  5. Если cntA больше cntB, то значит массив srcA больше массива srcB, и есть возможность, что в процессе сортировки элементы массива srcB будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массива srcA, а затем массива srcB.
  6. Если cntA меньше cntB, то значит массив srcA меньше массива srcB, и есть возможность, что в процессе сортировки элементы массива srcA будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массива srcB, а затем массива srcA.
  7. Если элементы srcA и srcB равны, то в dst записывается сначала элемент srcA, а затем элемент srcB.
  8. В функции merge_sort происходит рекурсивная сортировка массива array.
  9. Если count больше 1, то массив array разбивается на два массива, и каждый из них сортируется отдельно.
  10. Затем сортированные массивы объединяются в один массив tmp, и оригинальный массив array заменяется отсортированным массивом tmp.
  11. В функции dump происходит вывод элементов массива на экран.
  12. Если count больше 0, то выводится следующий элемент массива и счетчик count уменьшается на 1.
  13. Если count равен 0, то выводится символ новой строки \n.
  14. В функции main создается массив arr, содержащий 14 элементов.
  15. Выводится несортированный массив arr.
  16. Массив arr сортируется с помощью функции merge_sort.
  17. Выводится отсортированный массив arr.

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


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

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

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

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

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

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