гномья сортировка c код

Гномья сортировка

Гномья сортировка впервые была предложена 2 октября 2000 года Хамидом Сарбази-Азадом (Hamid Sarbazi-Azad). Он назвал ее «Глупая сортировка, простейший алгоритм сортировки всего с одним циклом…». И действительно, глупый этот метод или нет, но в нем задействован, никак в большинстве сортировок – два или более циклов, а только один. Позже, голландский ученый Дик Грун, на страницах одной из своих книг, привел для гномьей сортировки следующую аналогию.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодGnome Sort is based on the technique used by the standard Dutch Garden Gnome (Du.: tuinkabouter). Here is how a garden gnome sorts a line of flower pots. Basically, he looks at the flower pot next to him and the previous one; if they are in the right order he steps one pot forward, otherwise he swaps them and steps one pot backwards. Boundary conditions: if there is no previous pot, he steps forwards; if there is no pot next to him, he is done.

Перевод:

Гномья сортировка основана на технике, используемой обыкновенным голландским садовым гномом. Вот как садовый гном сортирует ряд цветочных горшков. По существу, он смотрит на два соседних цветочных горшка, если они находятся в правильном порядке, то он переходит на один горшок вперед, иначе он меняет их местами и возвращается на один горшок назад. Граничные условия: если позади нет ни одного горшка – он шагает вперед, а если нет следующего горшка, тогда он закончил.

Так описал основную идею алгоритма гномьей сортировки Дик Грун. Заменим гнома и горшки на более формальные объекты, например на указатель (номер текущего элемента) и элементы массива, и рассмотрим принцип работы алгоритма еще раз. Вначале указатель ставиться на 2-ый элемент массива (в C++ он имеет номер 1, а в Паскале номер 2).

Затем происходит сравнение двух соседних элементов A[i] и A[i-1], т. е. сравниваются первый элемент (i-1) и второй (i). Если те стоят на своих позициях, то сдвигаем указатель на позицию i+1 и продолжаем сравнение с нового положения; иначе меняем элементы местами, и, поскольку в какой-то момент может оказаться, что элементы в левом подмассиве стоят не на своих местах, сдвигаем указатель на одну позицию влево, осуществляя следующее сравнение с новой позиции. Так алгоритм продолжает выполняться до тех пор, пока весь массив не будет упорядочен.

Здесь следует выделить два важных момента.

Во-первых, процесс упорядочивания заканчивается, тогда когда не выполняется условие i #include «stdafx.h»
#include
using namespace std ;
int n ;
void Gnome_sort ( int i, int j, int * mas )
<
while ( i n )
<
if ( mas [ i — 1 ] mas [ i ] ) < i = j ; j ++ ; >
else
<
int t = mas [ i ] ;
mas [ i ] = mas [ i — 1 ] ; mas [ i — 1 ] = t ;
i — ;
if ( i == 0 ) < i = j ; j ++ ; >
> >
cout «Отсортированный массив: « ;
for ( i = 0 ; i n ; i ++ ) //вывод массива
cout mas [ i ] » « ;
>
void main ( )
<
setlocale ( LC_ALL, «Rus» ) ;
int m, k ;
cout «Размер массива > « ; cin >> n ;
int * a = new int [ n ] ;
for ( k = 0 ; k n ; k ++ ) //ввод массива
< cout k + 1 » элемент >« ; cin >> a [ k ] ; >
k = 1 ; m = 2 ;
Gnome_sort ( k, m, a ) ; //вызов функции сортировки
delete [ ] a ;
system ( «pause>>void» ) ;
>

Код программы на Pascal:

Кажется немного необычным, тот факт, что алгоритм сортировки использует всего один цикл. Плюс к этому, на практике гномья сортировка не уступает в скорости сортировки вставками, что видно из таблицы трех случаев этих сортировок.

Источник

Сортировка массива C#. Алгоритм «Гномья сортировка»

Название этого алгоритма сортировки происходит от предполагаемого поведения садовых гномов при сортировке садовых горшков. Так Дик Грун описал поведение алгоритма: «Гномья сортировка основана на технике, используемой обычным голландским садовым гномом. Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на текущий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил». Собственно, в этом описании и заложен весь алгоритм гномьей сортировки массива в C#.

Алгоритм

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

Реализация гномьей сортировки массива в C#

Как и в случае с сортировкой перемешиванием нам потребуются два метода — Swap() для того, чтобы поменять два элемента местами и, собственно, метод реализующий гномью сортировку в C#.

Пример сортировки массива

-10 0 0 1 2 2 3 3 3 4 4 4 5 5 5 6 7 7 8 9 11

Источник

Глупая сортировка и некоторые другие, поумнее

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
В прошлой статье мы оттолкнулись от так называемой глупой сортировки и путём нехитрых метаморфоз получили всем известную пузырьковую сортировку. Трансформируя последнюю пришли к целому вороху обменных способов упорядочивания массивов. Один из которых, между прочим, на структурах до нескольких тысяч элементов, даже работает быстрее чем быстрая сортировка.

Сегодня мы снова возьмём за основу stupid sort и внесём в неё другое маленькое, но существенное изменение. В результате получим совершенного другой эволюционный ряд сортировочных алгоритмов.

Глупая сортировка

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Кому лень смотреть первую серию, напомню, что из себя представляет глупая сортировка. Обходим по порядку массив и, встретив два неотсортированных соседа, меняем их местами. Затем возвращаемся на старт и «наша песня хороша, начинай сначала». Если в этой сортировке вместо возвращения просто идти дальше, то в получаем «пузырёк», который, как оказалось, тоже можно совершенствовать до бесконечности O(n log n).

Теперь поступим иначе. Обменяв два элемента, мы изменили порядок в массиве, и нужно как-то выяснить не вступает ли новое расположение в диссонанс с теми элементами, которые мы проверили ранее. Не будем прыгать в начало массива, не станем идти вперёд, а сделаем шаг назад. Если там теперь тоже не отсортировано, то установим строгую очерёдность по старшинству и сделаем ещё шаг назад. И так будем отступать до тех пор, пока не достигнем отсортированной части массива. После этого снова можно двигаться дальше.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Ну что ж, поздравляю тех, кто не знал про этот способ. Вы только что с познакомились с методом, имя которому…

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Гномья сортировка

image: голландский садовый гном

Хотя гномам этот способ известен уже много столетий, человеческая раса о нём узнала совсем недавно. Уже 55 лет как человечество использовало сортировку слиянием, прошло 40 лет как стала известна быстрая сортировка, уже спустя 35 лет как разработана пирамидальная сортировка – и вот, только в 2000 году, этот бесхитростный, практически детский приём, был исследован Диком Груном:

Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.

Разумеется, люди предложили способ по улучшению, до которого не додумались консервативные лилипуты. Если запоминать место в котором встретилось неотсортированное недоразумение и сделать несколько корректирующих итераций назад, то после наведения порядка в тылах, можно прыгнуть сразу туда где прервались и следовать по массиву далее.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Так немного быстрее, хотя принципиально это временную сложность не улучшает, она как была так и остаётся O(n 2 ). Но зато это приводит нас не только к новому способу сортировки, а даже к целому новому классу сортировок. И имя этой группе алгоритмов – «Сортировки вставками».

Сортировка простыми вставками

Здесь поступательно обрабатываются отрезки массива, начиная с первого элемента и затем расширяя подмассив, вставляем на своё место очередной неотсортированный элемент.

Для вставки используется буферная область памяти, в которой хранится элемент, ещё не оказавшийся на своём место (так называемый ключевой элемент). В подмассиве, начиная с правого края, просматриваются элементы и сравниваются с ключевым. Если больше ключевого, то очередной элемент сдвигается на одну позицию вправо, освобождая место для последующих элементов. Если в результате этого перебора попадается элемент, меньший или равный ключевому, то значит в текущую свободную ячейку можно вставить ключевой элемент.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Тот же оптимизированный «гномик», но только для обмена используется буфер.

Временная сложность у этой сортировки O(n 2 ), но не это главное. Сортировка вставками, судя по всему — наиболее эффективный вариант для почти отсортированных массивов. Этот факт используется в некоторых сложных алгоритмах сортировки. Помнится, я уже когда-то рассказывал про FlashSort, там при помощи вероятностного распределения быстро создаётся почти отсортированный массив, который затем доупорядочивается сортировкой вставками. Сортировка вставками используется в финальной части JSort, где путём построения неполной кучи массив оперативно почти сортируется. Timsort начинает сортировку массива с нахождения в нём почти упорядоченных отрезков, они также сортируются вставочным методом, а затем объединяются модифицированной сортировкой слиянием.

Как изволите видеть, хотя сортировка вставками сама по себе работает медленно, её сфера применения очень широка.

Ну, раз столь много букв написано про insertion sort, то рассказ будет не полным, если не сказать пару добрых слов про алгоритм, который называется…

Сортировка Шелла

Про сортировку Шелла уже есть статья на Хабре, поэтому буду очень краток.

Позавчера уже писал как из очень медленного «пузырька» можно сделать очень быструю «расчёску». Для этого сначала нужно сравнивать не соседей, а элементы, между которыми достаточно внушительное расстояние. Это позволяет на начальном этапе маленькие значения закинуть поближе к началу массива, большие – поближе к концу. Затем уменьшая разрыв, уже наводить в массиве локальные порядки.

Shell sort использует ту же стратегию. Сортируем вставкой подгруппы элементов, но только в подгруппе они идут не в ряд, а равномерно выбираются с некоторой дельтой по индексу. Методично уменьшая расстояние между элементами этих несвязных подмножеств, мы сортируем уже намного быстрее.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Временная сложность у «шелла» – достаточно сложный вопрос. Дело в том, что до сих пор нет строгой формулы, по которой строится оптимальный числовой ряд изменяющихся расстояний между элементами в подгруппах. Последовательность строится эмпирически, на основании многочисленных тестов с различными входными данными и последнее наилучшее уточнение для вышеупомянутых «дельт» было определено в 2001 году:

1, 4, 10, 23, 57, 132, 301, 701.

Сортировку Шелла придумал, как ни странно, Дональд Шелл в 1959 году. В 2014-м автору, кстати, исполняется 90 лет, живёт и здравствует до сих пор, недавно в третий раз женился. Так что, изобретайте алгоритмы, держите мозги в тонусе – и переживёте 3-х жён полноценная многолетняя творческая деятельность Вам обеспечена.

Источник

Описание алгоритмов сортировки и сравнение их производительности

Вступление

На эту тему написано уже немало статей. Однако я еще не видел статьи, в которой сравниваются все основные сортировки на большом числе тестов разного типа и размера. Кроме того, далеко не везде выложены реализации и описание набора тестов. Это приводит к тому, что могут возникнуть сомнения в правильности исследования. Однако цель моей работы состоит не только в том, чтобы определить, какие сортировки работают быстрее всего (в целом это и так известно). В первую очередь мне было интересно исследовать алгоритмы, оптимизировать их, чтобы они работали как можно быстрее. Работая над этим, мне удалось придумать эффективную формулу для сортировки Шелла.

Во многом статья посвящена тому, как написать все алгоритмы и протестировать их. Если говорить о самом программировании, то иногда могут возникнуть совершенно неожиданные трудности (во многом благодаря оптимизатору C++). Однако не менее трудно решить, какие именно тесты и в каких количествах нужно сделать. Коды всех алгоритмов, которые выложены в данной статье, написаны мной. Доступны и результаты запусков на всех тестах. Единственное, что я не могу показать — это сами тесты, поскольку они весят почти 140 ГБ. При малейшем подозрении я проверял и код, соответствующий тесту, и сам тест. Надеюсь, что статья Вам понравится.

Описание основных сортировок и их реализация

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

Сортировка пузырьком / Bubble sort

Будем идти по массиву слева направо. Если текущий элемент больше следующего, меняем их местами. Делаем так, пока массив не будет отсортирован. Заметим, что после первой итерации самый большой элемент будет находиться в конце массива, на правильном месте. После двух итераций на правильном месте будут стоять два наибольших элемента, и так далее. Очевидно, не более чем после n итераций массив будет отсортирован. Таким образом, асимптотика в худшем и среднем случае – O(n 2 ), в лучшем случае – O(n).

Шейкерная сортировка / Shaker sort

(также известна как сортировка перемешиванием и коктейльная сортировка). Заметим, что сортировка пузырьком работает медленно на тестах, в которых маленькие элементы стоят в конце (их еще называют «черепахами»). Такой элемент на каждом шаге алгоритма будет сдвигаться всего на одну позицию влево. Поэтому будем идти не только слева направо, но и справа налево. Будем поддерживать два указателя begin и end, обозначающих, какой отрезок массива еще не отсортирован. На очередной итерации при достижении end вычитаем из него единицу и движемся справа налево, аналогично, при достижении begin прибавляем единицу и двигаемся слева направо. Асимптотика у алгоритма такая же, как и у сортировки пузырьком, однако реальное время работы лучше.

Сортировка расческой / Comb sort

Еще одна модификация сортировки пузырьком. Для того, чтобы избавиться от «черепах», будем переставлять элементы, стоящие на расстоянии. Зафиксируем его и будем идти слева направо, сравнивая элементы, стоящие на этом расстоянии, переставляя их, если необходимо. Очевидно, это позволит «черепахам» быстро добраться в начало массива. Оптимально изначально взять расстояние равным длине массива, а далее делить его на некоторый коэффициент, равный примерно 1.247. Когда расстояние станет равно единице, выполняется сортировка пузырьком. В лучшем случае асимптотика равна O(nlogn), в худшем – O(n 2 ). Какая асимптотика в среднем мне не очень понятно, на практике похоже на O(nlogn).

Об этих сортировках (пузырьком, шейкерной и расческой) также можно почитать здесь.

Сортировка вставками / Insertion sort

Создадим массив, в котором после завершения алгоритма будет лежать ответ. Будем поочередно вставлять элементы из исходного массива так, чтобы элементы в массиве-ответе всегда были отсортированы. Асимптотика в среднем и худшем случае – O(n 2 ), в лучшем – O(n). Реализовывать алгоритм удобнее по-другому (создавать новый массив и реально что-то вставлять в него относительно сложно): просто сделаем так, чтобы отсортирован был некоторый префикс исходного массива, вместо вставки будем менять текущий элемент с предыдущим, пока они стоят в неправильном порядке.

Сортировка Шелла / Shellsort

Несколько полезных ссылок:

Сортировка деревом / Tree sort

Будем вставлять элементы в двоичное дерево поиска. После того, как все элементы вставлены достаточно обойти дерево в глубину и получить отсортированный массив. Если использовать сбалансированное дерево, например красно-черное, асимптотика будет равна O(nlogn) в худшем, среднем и лучшем случае. В реализации использован контейнер multiset.

Здесь можно почитать про деревья поиска:

Гномья сортировка / Gnome sort

Алгоритм похож на сортировку вставками. Поддерживаем указатель на текущий элемент, если он больше предыдущего или он первый — смещаем указатель на позицию вправо, иначе меняем текущий и предыдущий элементы местами и смещаемся влево.

Сортировка выбором / Selection sort

На очередной итерации будем находить минимум в массиве после текущего элемента и менять его с ним, если надо. Таким образом, после i-ой итерации первые i элементов будут стоять на своих местах. Асимптотика: O(n 2 ) в лучшем, среднем и худшем случае. Нужно отметить, что эту сортировку можно реализовать двумя способами – сохраняя минимум и его индекс или просто переставляя текущий элемент с рассматриваемым, если они стоят в неправильном порядке. Первый способ оказался немного быстрее, поэтому он и реализован.

Пирамидальная сортировка / Heapsort

Развитие идеи сортировки выбором. Воспользуемся структурой данных «куча» (или «пирамида», откуда и название алгоритма). Она позволяет получать минимум за O(1), добавляя элементы и извлекая минимум за O(logn). Таким образом, асимптотика O(nlogn) в худшем, среднем и лучшем случае. Реализовывал кучу я сам, хотя в С++ и есть контейнер priority_queue, поскольку этот контейнер довольно медленный.

Почитать про кучу можно здесь:

Быстрая сортировка / Quicksort

Выберем некоторый опорный элемент. После этого перекинем все элементы, меньшие его, налево, а большие – направо. Рекурсивно вызовемся от каждой из частей. В итоге получим отсортированный массив, так как каждый элемент меньше опорного стоял раньше каждого большего опорного. Асимптотика: O(nlogn) в среднем и лучшем случае, O(n 2 ). Наихудшая оценка достигается при неудачном выборе опорного элемента. Моя реализация этого алгоритма совершенно стандартна, идем одновременно слева и справа, находим пару элементов, таких, что левый элемент больше опорного, а правый меньше, и меняем их местами. Помимо чистой быстрой сортировки, участвовала в сравнении и сортировка, переходящая при малом количестве элементов на сортировку вставками. Константа подобрана тестированием, а сортировка вставками — наилучшая сортировка, подходящая для этой задачи (хотя не стоит из-за этого думать, что она самая быстрая из квадратичных).

Сортировка слиянием / Merge sort

Сортировка, основанная на парадигме «разделяй и властвуй». Разделим массив пополам, рекурсивно отсортируем части, после чего выполним процедуру слияния: поддерживаем два указателя, один на текущий элемент первой части, второй – на текущий элемент второй части. Из этих двух элементов выбираем минимальный, вставляем в ответ и сдвигаем указатель, соответствующий минимуму. Слияние работает за O(n), уровней всего logn, поэтому асимптотика O(nlogn). Эффективно заранее создать временный массив и передать его в качестве аргумента функции. Эта сортировка рекурсивна, как и быстрая, а потому возможен переход на квадратичную при небольшом числе элементов.

Сортировка подсчетом / Counting sort

Создадим массив размера r – l, где l – минимальный, а r – максимальный элемент массива. После этого пройдем по массиву и подсчитаем количество вхождений каждого элемента. Теперь можно пройти по массиву значений и выписать каждое число столько раз, сколько нужно. Асимптотика – O(n + r — l). Можно модифицировать этот алгоритм, чтобы он стал стабильным: для этого определим место, где должно стоять очередное число (это просто префиксные суммы в массиве значений) и будем идти по исходному массиву слева направо, ставя элемент на правильное место и увеличивая позицию на 1. Эта сортировка не тестировалась, поскольку большинство тестов содержало достаточно большие числа, не позволяющие создать массив требуемого размера. Однако она, тем не менее, пригодилась.

Блочная сортировка / Bucket sort

(также известна как корзинная и карманная сортировка). Пусть l – минимальный, а r – максимальный элемент массива. Разобьем элементы на блоки, в первом будут элементы от l до l + k, во втором – от l + k до l + 2k и т.д., где k = (r – l) / количество блоков. В общем-то, если количество блоков равно двум, то данный алгоритм превращается в разновидность быстрой сортировки. Асимптотика этого алгоритма неясна, время работы зависит и от входных данных, и от количества блоков. Утверждается, что на удачных данных время работы линейно. Реализация этого алгоритма оказалась одной из самых трудных задач. Можно сделать это так: просто создавать новые массивы, рекурсивно их сортировать и склеивать. Однако такой подход все же довольно медленный и меня не устроил. В эффективной реализации используется несколько идей:

1) Не будем создавать новых массивов. Для этого воспользуемся техникой сортировки подсчетом – подсчитаем количество элементов в каждом блоке, префиксные суммы и, таким образом, позицию каждого элемента в массиве.

2) Не будем запускаться из пустых блоков. Занесем индексы непустых блоков в отдельный массив и запустимся только от них.

3) Проверим, отсортирован ли массив. Это не ухудшит время работы, так как все равно нужно сделать проход с целью нахождения минимума и максимума, однако позволит алгоритму ускориться на частично отсортированных данных, ведь элементы вставляются в новые блоки в том же порядке, что и в исходном массиве.

4) Поскольку алгоритм получился довольно громоздким, при небольшом количестве элементов он крайне неэффективен. До такой степени, что переход на сортировку вставками ускоряет работу примерно в 10 раз.

Поразрядная сортировка / Radix sort

(также известна как цифровая сортировка). Существует две версии этой сортировки, в которых, на мой взгляд, мало общего, кроме идеи воспользоваться представлением числа в какой-либо системе счисления (например, двоичной).

LSD (least significant digit):

Представим каждое число в двоичном виде. На каждом шаге алгоритма будем сортировать числа таким образом, чтобы они были отсортированы по первым k * i битам, где k – некоторая константа. Из данного определения следует, что на каждом шаге достаточно стабильно сортировать элементы по новым k битам. Для этого идеально подходит сортировка подсчетом (необходимо 2 k памяти и времени, что немного при удачном выборе константы). Асимптотика: O(n), если считать, что числа фиксированного размера (а в противном случае нельзя было бы считать, что сравнение двух чисел выполняется за единицу времени). Реализация довольно проста.

MSD (most significant digit):

На самом деле, некоторая разновидность блочной сортировки. В один блок будут попадать числа с равными k битами. Асимптотика такая же, как и у LSD версии. Реализация очень похожа на блочную сортировку, но проще. В ней используется функция digit, определенная в реализации LSD версии.

Битонная сортировка / Bitonic sort:

Идея данного алгоритма заключается в том, что исходный массив преобразуется в битонную последовательность – последовательность, которая сначала возрастает, а потом убывает. Ее можно эффективно отсортировать следующим образом: разобьем массив на две части, создадим два массива, в первый добавим все элементы, равные минимуму из соответственных элементов каждой из двух частей, а во второй – равные максимуму. Утверждается, что получатся две битонные последовательности, каждую из которых можно рекурсивно отсортировать тем же образом, после чего можно склеить два массива (так как любой элемент первого меньше или равен любого элемента второго). Для того, чтобы преобразовать исходный массив в битонную последовательность, сделаем следующее: если массив состоит из двух элементов, можно просто завершиться, иначе разделим массив пополам, рекурсивно вызовем от половинок алгоритм, после чего отсортируем первую часть по порядку, вторую в обратном порядке и склеим. Очевидно, получится битонная последовательность. Асимптотика: O(nlog 2 n), поскольку при построении битонной последовательности мы использовали сортировку, работающую за O(nlogn), а всего уровней было logn. Также заметим, что размер массива должен быть равен степени двойки, так что, возможно, придется его дополнять фиктивными элементами (что не влияет на асимптотику).

Timsort

Гибридная сортировка, совмещающая сортировку вставками и сортировку слиянием. Разобьем элементы массива на несколько подмассивов небольшого размера, при этом будем расширять подмассив, пока элементы в нем отсортированы. Отсортируем подмассивы сортировкой вставками, пользуясь тем, что она эффективно работает на отсортированных массивах. Далее будем сливать подмассивы как в сортировке слиянием, беря их примерно равного размера (иначе время работы приблизится к квадратичному). Для этого удобного хранить подмассивы в стеке, поддерживая инвариант — чем дальше от вершины, тем больше размер, и сливать подмассивы на верхушке только тогда, когда размер третьего по отдаленности от вершины подмассива больше или равен сумме их размеров. Асимптотика: O(n) в лучшем случае и O(nlogn) в среднем и худшем случае. Реализация нетривиальна, твердой уверенности в ней у меня нет, однако время работы она показала довольно неплохое и согласующееся с моими представлениями о том, как должна работать эта сортировка.

Подробнее timsort описан здесь:

Тестирование

Железо и система

Процессор: Intel Core i7-3770 CPU 3.40 GHz
ОЗУ: 8 ГБ
Тестирование проводилось на почти чистой системе Windows 10 x64, установленной за несколько дней до запуска. Использованная IDE – Microsoft Visual Studio 2015.

Тесты

Размер входных данных

Как проводилось тестирование

На каждом тесте было производилось 20 запусков, итоговое время работы – среднее по получившимся значениям. Почти все результаты были получены после одного запуска программы, однако из-за нескольких ошибок в коде и системных глюков (все же тестирование продолжалось почти неделю чистого времени) некоторые сортировки и тесты пришлось впоследствии перетестировать.

Тонкости реализации

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

Результаты

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

Поскольку картинок очень много, они скрыты спойлерами. Немного комментариев по поводу обозначений. Сортировки названы так, как выше, если это сортировка Шелла, то в скобочках указан автор последовательности, к названиям сортировок, переходящих на сортировку вставками, приписано Ins (для компактности). В диаграммах у второй группы тестов обозначена возможная длина отсортированных подмассивов, у третьей группы — количество свопов, у четвертой — количество замен. Общий результат рассчитывался как среднее по четырем группам.

Первая группа сортировок

Массив случайных чисел

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Совсем скучные результаты, даже частичная отсортированность при небольшом модуле почти незаметна.

Частично отсортированный массив

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Уже гораздо интереснее. Обменные сортировки наиболее бурно отреагировали, шейкерная даже обогнала гномью. Сортировка вставками ускорилась только под самый конец. Сортировка выбором, конечно, работает совершенно также.

Свопы

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь наконец-то проявила себя сортировка вставками, хотя рост скорости у шейкерной примерно такой же. Здесь проявилась слабость сортировки пузырьком — достаточно одного свопа, перемещающего маленький элемент в конец, и она уже работает медленно. Сортировка выбором оказалась почти в конце.

Изменения в перестановке

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

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

Повторы

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь все сортировки (кроме, конечно, сортировки выбором) работали почти одинаково, ускоряясь по мере увеличении количества повторов.

Итоговые результаты

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

За счет своего абсолютного безразличия к массиву, сортировка выбором, работавшая быстрее всех на случайных данных, все же проиграла сортировке вставками. Гномья сортировка оказалась заметно хуже последней, из-за чего ее практическое применение сомнительно. Шейкерная и пузырьковая сортировки оказались медленнее всех.

Вторая группа сортировок

Массив случайных чисел

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Сортировка Шелла с последовательностью Пратта ведет себя совсем странно, остальные более менее ясно. Сортировка деревом любит частично отсортированные массивы, но не любит повторов, возможно, поэтому самое худшее время работы именно посередине.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Все как прежде, только Шелл с Праттом усилился на второй группе из-за отсортированности. Также становится заметным влияние асимптотики — сортировка деревом оказывается на втором месте, в отличие от группы с меньшим числом элементов.

Частично отсортированный массив

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь понятным образом ведут себя все сортировки, кроме Шелла с Хиббардом, который почему-то не сразу начинает ускоряться.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь все, в общем, как и прежде. Даже асимптотика сортировки деревом не помогла ей вырваться с последнего места.

Свопы

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь заметно, что у сортировок Шелла большая зависимость от частичной отсортированности, так как они ведут себя практически линейно, а остальные две только сильно падают на последних группах.

Изменения в перестановке

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь все похоже на предыдущую группу.

Повторы

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Опять все сортировки продемонстрировали удивительную сбалансированность, даже битонная, которая, казалось бы, почти не зависит от массива.

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Итоговые результаты

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Убедительное первое место заняла сортировка Шелла по Хиббарду, не уступив ни в одной промежуточной группе. Возможно, стоило ее отправить в первую группу сортировок, но… она слишком слаба для этого, да и тогда почти никого не было бы в группе. Битонная сортировка довольно уверенно заняла второе место. Третье место при миллионе элементах заняла другая сортировка Шелла, а при десяти миллионах сортировка деревом (асимптотика сказалась). Стоит обратить внимание, что при десятикратном увеличении размера входных данных все алгоритмы, кроме древесной сортировки, замедлились почти в 20 раз, а последняя всего лишь в 13.

Третья группа сортировок

Массив случайных чисел

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код
гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Почти все сортировки этой группы имеют почти одинаковую динамику. Почему же почти все сортировки ускоряются, когда массив частично отсортирован? Обменные сортировки работают быстрее потому, что надо делать меньше обменов, в сортировке Шелла выполняется сортировка вставками, которая сильно ускоряется на таких массивах, в пирамидальной сортировке при вставке элементов сразу завершается просеивание, в сортировке слиянием выполняется в лучшем случае вдвое меньше сравнений. Блочная сортировка работает тем лучше, чем меньше разность между минимальным и максимальным элементом. Принципиально отличается только поразрядная сортировка, которой все это безразлично. LSD-версия работает тем лучше, чем больший модуль. Динамика MSD-версия мне не ясна, то, что она сработала быстрее чем LSD удивило.

Частично отсортированный массив

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь все тоже довольно понятно. Стало заметен алгоритм Timsort, на него отсортированность действует сильнее, чем на остальные. Это позволило этому алгоритму почти сравняться с оптимизированной версией быстрой сортировки. Блочная сортировка, несмотря на улучшение времени работы при частичной отсортированности, не смогла обогнать поразрядную сортировку.

Свопы

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь очень хорошо сработали быстрые сортировки. Это, скорее всего, объясняется удачным выбором опорного элемента. Все остальное почти также, как и в предыдущей группе.

Изменения в перестановке

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Мне удалось достичь желаемой цели — поразрядная сортировка упала даже ниже адаптированной быстрой. Блочная сортировка оказалась лучше остальных. Еще почему-то timsort обогнал встроенную сортировку C++, хотя в предыдущей группе был ниже.

Повторы

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Здесь все довольно тоскливо, все сортировки работают с одинаковой динамикой (кроме линейных). Из необычного можно заметить, что сортировка слиянием упала ниже сортировки Шелла.

Итоговые результаты

гномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c кодгномья сортировка c код. Смотреть фото гномья сортировка c код. Смотреть картинку гномья сортировка c код. Картинка про гномья сортировка c код. Фото гномья сортировка c код

Если говорить о практическом применении, то хороша поразрядная сортировка (особенно lsd-версия), она стабильна, проста в реализации и очень быстра, однако не основана на сравнениях. Из основанных на сравнениях сортировок лучше всего смотрится быстрая сортировка. Ее недостатки — неустойчивость и квадратичное время работы на неудачных входных данных (пусть они и могут встретиться только при намеренном создании теста). Но с этим можно бороться, например, выбирая опорный элемент по какому-нибудь другому принципу, или же переходя на другую сортировку при неудаче (например, introsort, который, если не ошибаюсь, и реализован в С++). Timsort лишен этих недостатков, лучше работает на сильно отсортированных данных, но все же медленнее в целом и гораздо сложнее пишется. Остальные сортировки на данный момент, пожалуй, не очень практичны. Кроме, конечно, сортировки вставками, которую весьма удачно иногда можно вставить в алгоритм.

Заключение

Должен отметить, что не все известные сортировки приняли участие в тестировании, например, была пропущена плавная сортировка (мне просто не удалось ее адекватно реализовать). Впрочем, не думаю, что это большая потеря, эта сортировка очень громоздкая и медленная, как можно видеть, например, из этой статьи: habrahabr.ru/post/133996 Еще можно исследовать сортировки на распараллеливание, но, во-первых, у меня нет опыта, во-вторых, результаты, которые получались, крайне нестабильны, очень велико влияние системы.

Здесь можно посмотреть результаты всех запусков, а также некоторые вспомогательные тестирования: ссылка на документ.

Реализации алгоритмов с векторами остались, но их корректность и хорошую работу не гарантирую. Проще взять коды функций из статьи и переделать. Генераторы тестов тоже могут не соответствовать действительности, на самом деле такой вид они приняли уже после создания тестов, когда нужно было сделать программу более компактной.

В общем, я доволен проделанной работой, надеюсь, что Вам было интересно.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *