2009-10-03 2 views
9

У меня есть список строк, которые были отсортированы по определенной функции сравнения.Какой алгоритм сортировки лучше всего подходит для повторного сортировки почти полностью отсортированного списка?

Теперь мне нужно повторно отсортировать этот список, используя другую функцию сравнения.

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

Какой алгоритм сортировки лучше всего подходит для повторного сортировки этого почти полностью отсортированного списка с точки зрения скорости выполнения во время выполнения?

+1

Вы действительно ищете алгоритм * или просто эвристику? –

+2

Это алгоритм ... –

+0

Возможный дубликат [Какой алгоритм сортировки лучше всего работает в основном отсортированных данных?] (Http://stackoverflow.com/questions/220044/which-sort-algorithm-works-best-on-mostly- sorted-data) – nawfal

ответ

14

Insertion sort хорошо работает на небольших или почти отсортированных списках.

Из этого ACM Paper:

Тесты на случайно сгенерированных списках различных комбинаций длины списка и малых коэффициентов sortedness указывают , что прямой вставки Сортировка лучше всего для небольших или почти отсортированных списков и что Quickersort лучше всего .

Из вики статьи Insertion sort:

Если массив ввода уже отсортирован, сортировки вставки выполняет всего лишь как п-1 сравнения, что делает вставку сортировки более эффективна, когда данной отсортирован или «почти отсортированные» массивы.

SO Вопрос: Is there ever a good reason to use Insertion Sort?

+1

Обратите внимание, что QuickerSort не является QuickSort, но есть близкое сходство; в современной терминологии QuickerSort может считаться вариантом QuickSort, который сначала сортирует более короткое подмножество (минимизирует глубину стека для рекурсии) и имеет простой критерий выбора раздела, который, вероятно, восприимчив к плохой худшей производительности, но который будет хорошо работать для обсуждаемый здесь почти-отсортированный случай. –

+0

То же самое с пузырьковой сортировкой http://en.wikipedia.org/wiki/Bubble_sort – Max

+0

@Max: не совсем (у меня с Хенком была эта неудача совсем недавно). BubbleSort обычно используется по какой-либо причине, другой разработчик помнит об этом в колледже, и это просто (но не намного проще, чем сортировка вставки), и это похоже на сортировку общего назначения и быстро, когда они тестируют небольшое количество случайно упорядоченных элементов. Сортировка вставки выбирается в определенном сценарии. –

0

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

0

Как я понял, ваш список данных уже отсортирован (пусть, по порядку ascii/country charset), но без некоторых правил словаря применяется для конкретной страны. Например, Германия и их Умляуты

см Germanic_umlaut в википедии

вы не вставляя новые элементы, вы просто хотите прибегнуть их немного более строгих правил сортировки.

как вы можете прочитать, например, здесь

http://www.softpanorama.org/Algorithms/Sorting/bubblesort.shtml

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

0

Для почти отсортированных списков варианты сортировки Comb превосходят Quicksort. Я не тестировал, как сортировка гребенки сравнивается с сортировкой Insertion.