![]()
|
||||
Сортировка слияниемСортировка слиянием Процедура слияния требует два отсортированных массива. Заметив, что массив из одного элемента по определению является отсортированным, мы можем осуществить сортировку следующим образом: 1. разбить имеющиеся элементы массива на пары и осуществить слияние элементов каждой пары, получив отсортированные цепочки длины 2 (кроме, быть может, одного элемента, для которого не нашлось пары); 2. разбить имеющиеся отсортированные цепочки на пары, и осуществить слияние цепочек каждой пары; 3. если число отсортированных цепочек больше единицы, перейти к шагу 2. Проще всего формализовать этот алгоритм рекурсивным способом (в следующем разделе мы реализуем этот алгоритм итерационным способом). Функция
Поскольку функция template<class T> void MergeSort(T *const A, int const n) if( n < 2 ) return; //Сортировка не нужна if( n == 2 ) //Два элемента проще поменять местами, T *const B( new T[n] ); //Сюда запишем результат слияния Merge(A,n/2, A+n/2,n-n/2, B); //Слияние половин //Копирование результата слияния в исходный массив: delete[n] B; //Удаляем временный буфер Листинг 2. Реализация сортировки слиянием Время работы сортировки слиянием составляет Рис. 2. Пример работы рекурсивного алгоритма сортировки слиянием
|
||||
|