- Главная
- Информатика
- Алгоритм сортировки TimSort
Содержание
- 2. Timsort – гибридный алгоритм сортировки основанный на Insertion Sort и Merge Sort. Timsort сначала анализирует список,
- 3. Оценочное время работы Среди, на первый взгляд, огромного выбора в таблице есть всего 7 адекватных алгоритмов
- 4. Основные понятия N — размер входного массива run — упорядоченный подмассив во входном массиве. Причём упорядоченный
- 5. Как работает данный алгоритм? Начнем с того, что алгоритм состоит из трех частей: Вычисление minrun. Разбиение
- 6. Вычисление minrun Число minrun определяется на основе N исходя из следующих принципов: Оно не должно быть
- 7. Разбиение на подмассивы и их сортировка. Итак, на данном этапе у нас есть входной массив, его
- 8. Слияние. Нужно объединить полученные подмассивы для получения результирующего упорядоченного массива. Для достижения эффективности, нужно объединять подмассивы
- 9. Модификация слияния. Вышеуказанная процедура для них сработает, но каждый раз на её четвёртом пункте нужно будет
- 10. Были сгенерированы различные файлы и подсчитано время работы алгоритма в наносекундах. Тестирование на сгенерированных входных данных
- 11. Сравнение с другими сортировками
- 13. Скачать презентацию
Timsort – гибридный алгоритм сортировки основанный на Insertion Sort и Merge
Timsort – гибридный алгоритм сортировки основанный на Insertion Sort и Merge
Что такое
TimSort?
Оценочное время работы
Среди, на первый взгляд, огромного выбора в таблице есть
Оценочное время работы
Среди, на первый взгляд, огромного выбора в таблице есть
Основные понятия
N — размер входного массива
run — упорядоченный подмассив во входном массиве. Причём
Основные понятия
N — размер входного массива
run — упорядоченный подмассив во входном массиве. Причём
minrun — как было сказано выше, на первом шаге алгоритма входной массив будет поделен на подмассивы.
minrun — это минимальный размер такого подмассива. Это число рассчитывается по определённой логике из числа N.
Как работает данный алгоритм?
Начнем с того, что алгоритм состоит из трех
Как работает данный алгоритм?
Начнем с того, что алгоритм состоит из трех
Вычисление minrun.
Разбиение на подмассивы и их сортировка.
Каждый подмассив сортируется сортировкой вставками, пузырьком или любой другой устойчивой сортировкой.
Входной массив разделяется на подмассивы
фиксированной длины, вычисляемой определённым образом.
Отсортированные подмассивы объединяются в один массив с помощью модифицированной сортировкой слиянием.
Слияние.
Вычисление minrun
Число minrun определяется на основе N исходя из следующих принципов:
Оно не должно быть слишком
Вычисление minrun
Число minrun определяется на основе N исходя из следующих принципов:
Оно не должно быть слишком
Оно не должно быть слишком маленьким, поскольку чем меньше подмассив — тем больше итераций слияния подмассивов придётся выполнить на последнем шаге алгоритма.
Хорошо бы, чтобы N \ minrun было степенью числа 2 (или близким к нему). Это требование обусловлено тем, что алгоритм слияния подмассивов наиболее эффективно работает на подмассивах примерно равного размера.
Разбиение на подмассивы и их сортировка.
Итак, на данном этапе у нас
Разбиение на подмассивы и их сортировка.
Итак, на данном этапе у нас
Начиная с текущего элемента, ищем во входном массиве run (упорядоченный подмассив). По определению, в этот run однозначно войдет текущий элемент и следующий за ним, а вот дальше — уже как повезет. Если получившийся подмассив упорядочен по убыванию — переставляем элементы так, чтобы они шли по возрастанию (это простой линейный алгоритм, просто идём с обоих концов к середине, меняя элементы местами).
Если размер текущего run'а меньше чем minrun — берём следующие за найденным run-ом элементы в количестве minrun — size(run). Таким образом, на выходе у нас получается подмассив размером minrun или больше, часть которого (а в идеале — он весь) упорядочена.
Применяем к данному подмассиву сортировку вставками. Так как размер подмассива невелик и часть его уже упорядочена — сортировка работает быстро и эффективно.
Ставим указатель текущего элемента на следующий за подмассивом элемент.
Если конец входного массива не достигнут — переход к пункту 2, иначе — конец данного шага.
Слияние.
Нужно объединить полученные подмассивы для получения результирующего упорядоченного массива. Для достижения
Слияние.
Нужно объединить полученные подмассивы для получения результирующего упорядоченного массива. Для достижения
Описание процедуры слияния:
Шаг 0. Создается временный массив в размере меньшего из сливаемых подмассивов.
Шаг 1. Меньший из подмассивов копируется во временный массив, но надо учесть, что если меньший подмассив — правый, то ответ (результат сливания) формируется справа налево. Дабы избежать данной путаницы, лучше копировать всегда левый подмассив во временный. На скорости это практически не отразится.
Шаг 2. Ставятся указатели текущей позиции на первые элементы большего и временного массива.
Шаг 3. На каждом шаге рассматривается значение текущих элементов в большем и временном массивах, берется меньший из них, копируется в новый отсортированный массив. Указатель текущего элемента перемещается в массиве, из которого был взят элемент.
Шаг 4. Предыдущий пункт повторяется, пока один из массивов не закончится.
Шаг 5.Все элементы оставшегося массива добавляются в конец нового массива.
Модификация слияния.
Вышеуказанная процедура для них сработает, но каждый раз на её
Модификация слияния.
Вышеуказанная процедура для них сработает, но каждый раз на её
Шаг 0. Начинается процедура слияния.
Шаг 1. На каждой операции копирования элемента из временного или большего подмассива в результирующий запоминается, из какого именно подмассива был элемент.
Шаг 2. Если уже некоторое количество элементов (например, в JDK 7 это число равно 7) было взято из одного и того же массива — предполагается, что и дальше придётся брать данные из него. Чтобы подтвердить эту идею, алгоритм переходит в режим галопа, то есть перемещается по массиву-претенденту на поставку следующей большой порции данных бинарным поиском (массив упорядочен) текущего элемента из второго соединяемого массива.
Шаг 3. В момент, когда данные из текущего массива-поставщика больше не подходят (или был достигнут конец массива), данные копируются целиком.
Были сгенерированы различные файлы и подсчитано время работы алгоритма в наносекундах.
Тестирование
Были сгенерированы различные файлы и подсчитано время работы алгоритма в наносекундах.
Тестирование
Брались случайные числа в промежутке: [-5000;5000]
Каждый пакет тестирования содержал в себе 100 текстовых файлов с количеством строк от 100 до 10^6. По итогам подсчетов средней скорости работы:
100 строк – 39325 нс
10^3 строк – 149981 нс
10^4 строк – 873544 нс
10^5 строк – 9076863 нс
10^5 * 5 строк – 49450771 нс
10^6 строк – 102751353 нс
Сравнение с другими сортировками
Сравнение с другими сортировками