Какой алгоритм сортировки лучше всего работает в основном отсортированных данных?

Какой алгоритм сортировки лучше всего работает в основном отсортированных данных?

Ответ 1

Основываясь на высоконаучном методе просмотра анимированных gifs Я бы сказал, что вставки и Bubble - хорошие кандидаты.

Ответ 2

Только несколько элементов = > INSERTION SORT

Элементы в основном отсортированы = > INSERTION SORT

Обеспокоена наихудшими сценариями = > HEAP SORT

Интересует хороший результат среднего результата = > QUICKSORT

Элементы взяты из плотной вселенной = > BUCKET SORT

Желайте написать как можно меньше кода = > INSERTION SORT

Ответ 3

timsort

Timsort - это "адаптивная, стабильная, естественная слияния" со сверхвысокой эффективностью" на многих виды частично упорядоченных массивов (требуется меньше, чем lg (N!) сравнений, и всего лишь N-1) ". Python встроенный sort() использовал этот алгоритм в течение некоторого времени, по-видимому, с хорошими результатами. Он специально предназначен для обнаружения и использования частично отсортированных подпоследовательностей во входе, которые часто встречаются в реальном часто бывает в реальном мире, что сравнение намного дороже, чем замена элементов в списке, поскольку обычно типично просто переопределяет указатели, что очень часто делает timsort отличным выбором. Однако, если вы знаете, что ваши сравнения всегда очень дешево (например, написать игрушечную программу для сортировки 32-битных целых чисел), существуют другие алгоритмы, которые, вероятно, будут работать лучше. Самый простой способ использовать timsort - это, конечно, использовать Python, но поскольку Python является открытым исходным кодом, вы может также иметь возможность заимствовать код. В качестве альтернативы, приведенное выше описание содержит более чем достаточно подробностей для написания вашей собственной реализации.

Ответ 4

Вставка сортируется со следующим поведением:

  • Для каждого элемента k в слотах 1..n сначала проверьте, есть ли el[k] >= el[k-1]. Если это так, перейдите к следующему элементу. (Очевидно, пропустите первый элемент.)
  • Если нет, используйте двоичный поиск в элементах 1..k-1, чтобы определить местоположение вставки, а затем перезапустите элементы. (Вы можете сделать это только в том случае, если k>T, где T - некоторое пороговое значение, при малом k это перебор.)

Этот метод делает наименьшее количество сравнений.

Ответ 5

Попробуйте интроспективный вид. http://en.wikipedia.org/wiki/Introsort

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

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

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

Если вы программист на С++, проверьте свой алгоритм std:: sort. Он может уже использовать внутренний вид внутри.

Ответ 6

Вставка или сортировка оболочки!

Ответ 7

Splaysort - это нечеткий метод сортировки, основанный на splay trees, тип адаптивного двоичного дерева. Splaysort хорош не только для частично отсортированных данных, но и частично реверсированных данных или даже любых данных, которые имеют какой-либо ранее существующий порядок. Это O (nlogn) в общем случае, и O (n) в случае, когда данные сортируются каким-то образом (вперед, назад, орган-труба и т.д.).

Его большое преимущество перед сортировкой вставки заключается в том, что оно не возвращается к поведению O (n ^ 2), когда данные не сортируются вообще, поэтому вам не нужно быть абсолютно уверенным, что данные частично отсортированы перед использованием.

Недостатком является лишний объем служебной информации в структуре дерева разметки, в которой он нуждается, а также время, необходимое для создания и уничтожения дерева splay. Но в зависимости от размера данных и количества предварительно сортировки, которые вы ожидаете, накладные расходы могут стоить того, чтобы увеличить скорость.

A статья о splaysort была опубликована в Software - Practice and Experience.

Ответ 8

Dijkstra smoothsort - отличный вариант для уже отсортированных данных. Это вариант heapsort, который работает в O (n lg n) в худшем случае и O (n) в лучшем случае. я написал анализ алгоритма, если вам интересно, как это работает.

Естественный mergesort - еще один действительно хороший для этого - это вариант слияния снизу вверх, который работает, рассматривая вход как конкатенацию нескольких разных отсортированных диапазонов, а затем используя алгоритм слияния, чтобы объединить их. Вы повторяете этот процесс, пока не будет отсортирован весь диапазон ввода. Это выполняется в O (n) времени, если данные уже отсортированы и O (n lg n) в худшем случае. Он очень изящный, хотя на практике он не так хорош, как некоторые другие адаптивные типы, такие как Timsort или smoothsort.

Ответ 9

Сортировка вставки занимает время O (n + количество инверсий).

Инверсия - это пара (i, j) такая, что i < j && a[i] > a[j]. То есть, пара вне порядка.

Одним из показателей того, что он "почти отсортирован", является число инверсий - для "данных с несколькими инверсиями" можно взять "почти отсортированные данные". Если известно, что число инверсий является линейным (например, вы только что добавили O (1) элементы в отсортированный список), сортировка вставки принимает время O (n).

Ответ 10

Если элементы уже отсортированы или имеется только несколько элементов,  это было бы идеальным вариантом для сортировки вставки!

Ответ 11

Как и все остальные, будьте осторожны с наивным Quicksort, который может иметь производительность O (N ^ 2) при сортировке или сортировке данных. Тем не менее, с соответствующим алгоритмом выбора поворота (как случайного, так и медианного из трех), см. Выбор точки для быстрого сортировки), Quicksort все равно будет работать.

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

Ответ 12

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

Пусть N - количество элементов, M - число вне порядка.

Сортировка Bubble должна будет сделать что-то вроде 2 * M + 1 через все N элементов. Если M очень мало (0, 1, 2?), Я думаю, что это будет очень сложно победить.

Если M мало (скажем, меньше, чем log N), сортировка вставки будет иметь большую среднюю производительность. Однако, если нет трюка, которого я не вижу, это будет очень плохой результат. (Правильно? Если последний элемент в заказе на первом месте, вам нужно вставить каждый элемент, насколько я могу видеть, что убьет производительность.) Я предполагаю, что там есть более надежный алгоритм сортировки для этого но я не знаю, что это такое.

Если M больше (скажем, равно или больше, чем log N), интроспективная сортировка почти наверняка лучшая.

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

Дальнейшие мысли (за одну ночь): если M + 1 < N/M, тогда вы можете отсканировать список, ищущий запуск N/M в строке, которые сортируются, а затем развернуть этот прогон в любом направлении, чтобы найти элементы вне порядка. Это займет не более 2N сравнений. Затем вы можете отсортировать несортированные элементы и выполнить сортировку слияния в двух списках. Я думаю, что общее сравнение должно быть меньше, чем что-то вроде 4N + M log2 (M), которое, как мне кажется, будет бить любую неспециализированную процедуру сортировки. (Еще больше подумал: это сложнее, чем я думал, но я все еще думаю, что это разумно возможно.)

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

Ответ 13

Если вам нужна конкретная реализация для алгоритмов сортировки, структур данных или чего-либо, у кого есть ссылка на выше, могу ли я рекомендовать вам отличный "Data Structures and Algorithms" на CodePlex?

У него будет все, что вам нужно, не изобретая колесо.

Просто мое маленькое зерно соли.

Ответ 14

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

Ответ 15

Сортировка вставки - лучший пример O (n) на отсортированном входе. И это очень близко к главным образом отсортированным вводам (лучше, чем быстрый сортировать).

Ответ 16

Подумайте о попытке кучи. Я считаю, что это самый последовательный тип O (n lg n).

Ответ 17

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

Ответ 18

Хорошо, это зависит от варианта использования. Если вы знаете, какие элементы изменены, удалите и вставьте, насколько мне известно, лучший случай.

Ответ 19

Сорт Bubble определенно является победителем Следующим на радаре будет сортировка вставки.

Ответ 20

Беречь от QuickSort - это очень неэффективно для предварительно отсортированных данных. Сортировка вставки обрабатывает почти отсортированные данные, перемещая как можно меньше значений.