Гроккинг Тимсорт

Там's (относительно) новая сортировка в блоке под названием Timsort. Это'был использован как Pythons list.sort, и теперь будетновый Array.sort в Java 7.

Там внекоторая документация икрошечная статья в Википедии описание высокоуровневых свойств сортировки и некоторые низкоуровневые оценки производительности, но мне было любопытно, может ли кто-нибудь предоставить какой-нибудь псевдокод, чтобы проиллюстрировать, что именно делает Timsort, и какие ключевые моменты делают его быстрым. (Особенно в отношении цитируемой статьи "Оптимистическая сортировка и теоретико-информационная сложность. ")

(Смотрите такжесвязанный пост StackOverflow.)

 dmckee14 нояб. 2009 г., 04:51
Эта ссылкаsvn.python.org/projects/python/trunk/Objects/listsort.txt Из предыдущего вопроса довольно ясно. Это'Оптимизированная и оптимизированная сортировка слиянием.
 Yang15 нояб. 2009 г., 01:05
Я действительно имел в виду ссылку на это в моем "некоторая документация " ссылка на сайт. Исправлена. Мой вопрос был конкретно ответом на этот документ - я нея не считаю его полезным для понимания Timsort с уровня псевдокодирования.

Ответы на вопрос(2)

список рассылки core-libs когда это вошло так, там есть некоторое обсуждение и полезные ссылки там. Вот'свеб-версия с изменениями обзора кода, а такжеоригинальный патч.

Комментарии в коде говорят:

Примечание о реализации: Эта реализация является стабильной, адаптивной,

итеративная сортировка слиянием, которая требует намного меньше чем n lg (n) сравнений

когда входной массив частично отсортирован, предлагая

производительность традиционной сортировки слиянием, когда входной массив

в произвольном порядке. Если входной массив почти отсортирован,

реализация требует примерно n сравнений.

Требования к временному хранению варьируются от небольшой константы для почти отсортированных

входные массивы для n / 2 ссылок на объекты для случайного упорядоченного ввода

массивы.

Реализация имеет одинаковое преимущество по возрастанию и

по убыванию в его входном массиве, и может воспользоваться

Восходящий и нисходящий порядок в разных частях одного и того же

входной массив. Он хорошо подходит для объединения двух или более отсортированных массивов:

просто объедините массивы и отсортируйте полученный массив.

Реализация была адаптирована из Тим Питерссортировка списка для Python

TimSort, Это использует методы от Питера Макилроя "Оптимистичный

Сортировка и информационно-теоретическая сложность ", в материалах

Четвертый ежегодный симпозиум ACM-SIAM по дискретным алгоритмам, стр. 467-474,

Январь 1993 г.

Там похороненочень полезная ссылка на детали реализации Pythonи я думаю, чтоОтличное место для начала, за которым следует код. Чтобы достичь невероятно высокого уровня, timsort улучшает производительность, замечая прогоны отсортированных данных и используя преимущества этой структуры во время сортировки.

 Yang15 нояб. 2009 г., 01:06
Я действительно имел в виду ссылку на это в моем "некоторая документация " ссылка на сайт. Исправлена. Мой вопрос был конкретно ответом на этот документ - я нея не считаю его полезным для понимания Timsort с уровня псевдокодирования.
Решение Вопроса

Визуализация алгоритмов сортировки: Python 'тимсорт

Бизнес-конец timsort - это сортировка слиянием, которая работает с предварительно отсортированными элементами. Минимальная длина прогона minrun выбрана, чтобы убедиться, что окончательные слияния максимально сбалансированы - для 64 элементов minrun оказывается равным 32. Перед началом слияния выполняется один проход по данным для обнаружения уже существующих прогонов отсортированного элементы. Нисходящие трассы обрабатываются простым обращением их на месте. Если результирующая длина цикла меньше minrun, она увеличивается до minrun с помощью сортировки вставкой. В перетасованном массиве без каких-либо существенных ранее выполненных запусков этот процесс выглядит точно так же, как и наше предположение выше: предварительная сортировка блоков элементов minrun с использованием сортировки вставкой перед объединением с сортировкой слиянием.

[...]

timsort находит нисходящий прогон и меняет маршрут на месте. Это делается прямо на массиве указателей, так что кажетсямгновенный" с нашей точки зрения.Прогон теперь увеличен до минимальной длины, используя сортировку вставкой.В начале следующего блока прогон не обнаружен, и сортировка вставки используется для сортировки всего блока. Обратите внимание, что отсортированные элементы внизу этого блока не обрабатываются специально - timsort не делаетОбнаружение прогонов, которые начинаются в середине блоков, повышается до minrun.Наконец, mergesort используется для объединения прогонов.
 Mike667922 мая 2014 г., 22:31
ссылка мертва ???
 Yang15 нояб. 2009 г., 02:10
Благодарю. Это, вероятно, довольно близко, как ядоберусь до того, что я просил. Мой вывод, что он готовит блоки ('minruns') из 32 эльтов со вставкой сортировки и обратного на месте.

Ваш ответ на вопрос