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

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

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

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

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

textual
Листинг программы
/* ANSI C 99 */
#include <stdio.h>
#include <string.h>
 
void merge(const int * srcA, size_t cntA, const int * srcB, size_t cntB, int * dst) {
    while ( cntA ) {
        if ( cntB ) {
            if ( *srcA < *srcB ) {
                *dst++ = *srcA++;
                --cntA;
            }
            else if ( *srcA > *srcB ) {
                *dst++ = *srcB++;
                --cntB;
            }
            else {
                *dst++ = *srcA++;
                *dst++ = *srcB++;
                --cntA;
                --cntB;
            }
        }
        else {
            *dst++ = *srcA++;
            --cntA;
        }
    }
    while ( cntB ) {
        *dst++ = *srcB++;
        --cntB;
    }
}
 
int * merge_sort(int * array, size_t count) {
    if ( count > 1 ) {
        int tmp[count];
        merge(merge_sort(array, count / 2), count / 2, merge_sort(array + count / 2, count - count / 2), count - count / 2, tmp);
        memcpy(array, tmp, sizeof(int) * count);
    }
    return array;
}
 
void dump(const int * array, size_t count) {
    while ( count-- )
        printf("%d%c", *array++, ( count ) ? ' ' : '\n');
}
 
#define elements_count(a) ( sizeof(a) / sizeof(*(a)) )
 
int main(void) {
    int arr[] = { 3, 5, 2, 4, 2, 9, 1, 0, 6, 9, 0, 2 };
    
    printf("Unsorted: ");
    dump(arr, elements_count(arr));
    printf("Sorted:   ");
    dump(merge_sort(arr, elements_count(arr)), elements_count(arr));
    
    return 0;
}

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

  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
Похожие ответы