Я сортирую массив целых ключей.
Информация о данных:
- Массивы длиной 1176
- Ключи от 750 000 до 135 000 000; также возможно 0
- Существует много дубликатов, в каждом массиве есть только от 48 до 100 различных ключей, но невозможно предсказать, какие значения из всего диапазона будут
- Существует много длинно отсортированных подпоследовательностей, большинство массивов состоят из от 33 до 80 отсортированных подпоследовательностей
- Самый маленький элемент - 0; число 0 предсказуемо и в очень узком диапазоне, около 150 на массив
То, что я пробовал до сих пор:
-
stdlib.h qsort;
это медленно, прямо сейчас моя функция тратит 0,6 с на сортировку за выполнение, с stdlib.h qsort it 1.0s; это имеет ту же производительность, что и std:: sort
-
Timsort;
Я пробовал это: https://github.com/swenson/sort и это: http://code.google.com/p/timsort/source/browse/trunk/timSort.c?spec=svn17&r=17; оба были значительно медленнее, чем stdlib qsort
-
их комбинация быстрой сортировки и сортировки вставки является самой быстрой для моих данных; Я экспериментировал с различными настройками и поворачивался как средний элемент (не медианный из 3) и вставлял сортировку, начиная с 28-элементных вспомогательных массивов (не 8 по умолчанию) дает лучшую производительность
-
сортировка оболочки;
простая реализация с пробелами в этой статье: http://en.wikipedia.org/wiki/Shellsort; он был приличным, хотя и медленнее, чем stdlib qsort
Мои мысли о том, что qsort делает много изменений и развалин (т.е. обратных) отсортированных подпоследовательностей, поэтому должен быть какой-то способ улучшить его, используя структуру данных, к сожалению, все мои попытки потерпят неудачу. Если вам интересно, что это за данные, то это наборы рук в покере, которые оцениваются на разных досках, уже отсортированных на предыдущей плате (это и есть отсортированные подпоследовательности).
Функция находится в C. Я использую Visual Studio 2010. Любые идеи?
Пример данных: http://pastebin.com/kKUdnU3N
Пример полного выполнения (1176 видов): https://dl.dropbox.com/u/86311885/out.zip