Сортировка слиянием - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д