алгоритмы сортировки для наиболее часто отсортированного списка

Я работаю над списком целых чисел из файла. И мне нужно использовать алгоритм сортировки, чтобы классифицировать их в порядке убывания. Я знаком с временем выполнения нескольких алгоритмов сортировки и знаю, что их использование носит ситуативный характер. Итак, мой вопрос: Какой был бы самый быстрый алгоритм сортировки для списка ЛЮБОГО размера, который уже отсортирован на 90%? (в моем файле у меня 10 000 записей, но 9 500 из них уже отсортированы).

Спасибо,


person Samuel    schedule 25.08.2013    source источник
comment
Для начала, почему бы вам не провести сравнительный анализ? Сортировка вставкой хорошо работает для небольших почти отсортированных списков ... но является ли она самой быстрой?   -  person Mitch Wheat    schedule 25.08.2013
comment
Мой личный фаворит в любом случае - это алгоритм внутренней сортировки, если вы знаете, что существует довольно высокий процент почти отсортированных списков, вы можете просто настроить пошаговую сортировку с помощью динамической сортировки.   -  person dhein    schedule 25.08.2013
comment
В зависимости от платформы сортировка по умолчанию может быть адаптивной. Например, Python и Java 7 используют Timsort, который представляет собой сортировку слиянием, в которой уже используются прогоны. присутствует на входе. Проверьте, можете ли вы просто использовать подходящую библиотечную функцию.   -  person user2357112 supports Monica    schedule 25.08.2013
comment
Сортировка вставкой, кажется, популярна для этого типа ввода. stackoverflow.com/questions/1513566/ stackoverflow.com/questions/220044/   -  person DavidN    schedule 25.08.2013
comment
@Zaibis Но разве heapsort не требует использования узлов?   -  person Samuel    schedule 25.08.2013
comment
Сортировка на самом деле не такая ситуативная, за исключением уже существующих структур данных. При их отсутствии хорошая медиана быстрой сортировки обычно является самой быстрой, за исключением самых маргинальных ситуаций.   -  person RBarryYoung    schedule 25.08.2013
comment
Я просто пробовал использовать пузырь и сортировку по выбору. У обоих одинаковая среда выполнения, но похоже, что сортировка вставкой - это то, что все предлагают. Я просто соглашусь с этим. Спасибо за ответы.   -  person Samuel    schedule 25.08.2013
comment
Что вы имеете в виду под узлами? и я вообще не говорю о heapsort, я говорю об интроспективной сортировке (это смесь быстрой сортировки и алгоритма сортировки O (n log n) (например, heapsort).   -  person dhein    schedule 25.08.2013
comment
И вы ищете алгоритм сортировки, чтобы использовать или написать его самостоятельно?   -  person dhein    schedule 25.08.2013
comment
Вы консультировались с Википедией и др.?   -  person Hot Licks    schedule 25.08.2013
comment
@Samuel: Heapsort не требует узлов. Вы можете реализовать кучу в массиве, узлы не требуются.   -  person Jim Mischel    schedule 25.08.2013
comment
Если 9500 элементов уже отсортированы, и вам просто нужно добавить 500 несортированных, вероятно, самым быстрым будет отсортировать 500 (используя сортировку, предоставленную вашей библиотекой), а затем объединить с 9500. Честно говоря, сортировка 10000 элементов занимает всего несколько миллисекунд. Если вы не делаете это тысячи раз в секунду, вам гораздо лучше использовать все, что есть в вашей языковой библиотеке.   -  person Jim Mischel    schedule 25.08.2013
comment
хорошая ссылка, чтобы увидеть, какой алгоритм сортировки лучше всего: на мой взгляд, это сортировка вставками. Перейдите по ссылке: sorting-algorithms.com   -  person Himanshu Pandey    schedule 25.08.2013


Ответы (3)


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

  1. Он отлично работает, когда список почти отсортирован (хотя он имеет порядок O (N ^ 2), если список почти отсортирован, внутренний цикл не будет выполняться часто)
  2. Реализовать это довольно просто.

Представляем реализацию сортировки вставкой в ​​Python.

Программа

def InsertionSort(Array):
    Total = 0
    for i in xrange(1, len(Array)):
        j, I, = i - 1, i
        while j >= 0 and Array[I] > Array[j]:
            Array[I], Array[j] = Array[j], Array[I]
            j, I, Total = j - 1, I - 1, Total + 1
    print "Insertion Sort Total Operations :", Total

Вывод

Наихудший случай

TestArray  = range(1, 11)
InsertionSort(TestArray)
Insertion Sort Total Operations : 45

Bestcase

TestArray  = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
InsertionSort(TestArray)
Insertion Sort Total Operations : 0

90% отсортированный массив

TestArray  = [1, 9, 8, 7, 6, 5, 4, 3, 2, 10]
InsertionSort(TestArray)
Insertion Sort Total Operations : 17

Полусортированный массив

TestArray  = [10, 9, 8, 7, 6, 1, 2, 3, 4, 5]
InsertionSort(TestArray)
Insertion Sort Total Operations : 10
person thefourtheye    schedule 25.08.2013
comment
Но, конечно, приведенный выше код Python должен служить только псевдокодом, чтобы помочь в реализации сортировки вставкой на других языках. В Python используется встроенная сортировка, которая использует Timsort, что даже лучше для частично отсортированных данных. - person Paddy3118; 25.08.2013

Алгоритм Timsort, разработанный для Python (и теперь используемый в Java), оптимизирован для работы с частично отсортированные "прогоны" встроены.

person Paddy3118    schedule 25.08.2013
comment
В следующем сообщении о Timsort на C # есть статистика сравнения Timsort с собственной модифицированной подпрограммой быстрой сортировки C # для случайных и частично отсортированных данных, а также с кодом C # для Timsort: timsort4net.codeplex.com - person Paddy3118; 25.08.2013
comment
Недавно я протестировал реализацию C # Timsort с сайта timsort4net.codeplex.com и с удивлением обнаружил, что она примерно в 3 раза медленнее, чем В .NET 4.0 по умолчанию используется вызов Array.Sort () для всех размеров массивов ›64. Это сохраняется даже при различной степени беспорядка массива от примерно 10% случайного до 100% случайного. Время как .NET, так и Timsort сократилось с меньшим начальным нарушением, но соотношение во всех случаях оставалось примерно 1: 3. В этом коде может быть одна или несколько серьезных ошибок реализации. - person Special Sauce; 28.02.2017
comment
Оказывается, я на самом деле тестировал интроспективную сортировку .NET 4.5, что является улучшением по сравнению с более ранними реализациями. Итак, мои тесты показали, что интроспективная сортировка .NET 4.5 примерно в 3 раза быстрее, чем реализация timsort4net.codeplex.com. - person Special Sauce; 01.03.2017

Для std :: sort C ++ использует интроспективную сортировку, при которой массив / список сначала сортируется с использованием быстрой сортировки для определенной глубины рекурсии, а затем heapsort. Я не знаю о 90%, но heapsort, похоже, хорошо работает с уже отсортированными массивами / списками ... поэтому я рекомендую вам попробовать это.

person Joohwan    schedule 25.08.2013