Сортировка слиянием - 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;
- }
Объяснение кода листинга программы
- В функции
merge
происходит сортировка слиянием массивовsrcA
иsrcB
в массивdst
. - Если
cntA
большеcntB
, то значит массивsrcA
больше массиваsrcB
, и есть возможность, что в процессе сортировки элементы массиваsrcB
будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массиваsrcA
, а затем массиваsrcB
. - Если
cntA
меньшеcntB
, то значит массивsrcA
меньше массиваsrcB
, и есть возможность, что в процессе сортировки элементы массиваsrcA
будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массиваsrcB
, а затем массиваsrcA
. - Если элементы
srcA
иsrcB
равны, то вdst
записывается сначала элементsrcA
, а затем элементsrcB
. - Если
cntA
большеcntB
, то значит массивsrcA
больше массиваsrcB
, и есть возможность, что в процессе сортировки элементы массиваsrcB
будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массиваsrcA
, а затем массиваsrcB
. - Если
cntA
меньшеcntB
, то значит массивsrcA
меньше массиваsrcB
, и есть возможность, что в процессе сортировки элементы массиваsrcA
будут перезаписаны. Поэтому в этой ветке сначала сортируются элементы массиваsrcB
, а затем массиваsrcA
. - Если элементы
srcA
иsrcB
равны, то вdst
записывается сначала элементsrcA
, а затем элементsrcB
. - В функции
merge_sort
происходит рекурсивная сортировка массиваarray
. - Если
count
больше 1, то массивarray
разбивается на два массива, и каждый из них сортируется отдельно. - Затем сортированные массивы объединяются в один массив
tmp
, и оригинальный массивarray
заменяется отсортированным массивомtmp
. - В функции
dump
происходит вывод элементов массива на экран. - Если
count
больше 0, то выводится следующий элемент массива и счетчикcount
уменьшается на 1. - Если
count
равен 0, то выводится символ новой строки\n
. - В функции
main
создается массивarr
, содержащий 14 элементов. - Выводится несортированный массив
arr
. - Массив
arr
сортируется с помощью функцииmerge_sort
. - Выводится отсортированный массив
arr
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д