Какая временная сложность у алгоритма сортировки timsort
Перейти к содержимому

Какая временная сложность у алгоритма сортировки timsort

  • автор:

TimSort: Алгоритм и реализация в Python

Python TimSort-это гибридный алгоритм сортировки слияния и сортировки вставки. Это стабильный алгоритм, работающий на данных реального времени.

  • Автор записи

TimSort: Алгоритм и реализация в Python

Привет, кодеры!! В этой статье мы познакомимся с алгоритмом TimSort и изучим его реализацию на Python. Тим Питерс создал TimSort в 2002 году to улучшить производительность сортировки списка. Функция sort() использует этот алгоритм и является самым быстрым алгоритмом сортировки.

Что такое алгоритм Python TimSort?

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

Алгоритм Python TimSort:

  1. Разделите массив на блоки, известные как run
  2. Размер прогона может быть как 32, так и 64
  3. Сортировка элементов каждого прогона с помощью сортировки вставки
  4. Слияние отсортированных запусков с помощью алгоритма сортировки слиянием
  5. Удваивайте размер объединенного массива после каждой итерации

Понимание алгоритма в деталях:

Расчет минимального пробега:

Теперь мы знаем, что первым шагом алгоритма Python Timsort является разделение блоков на прогоны. minrun – это минимальная длина каждого пробега. Он вычисляется из числа элементов массива N.

  • Это не должно быть очень долго, так как мы будем реализовывать сортировку вставки для сортировки каждого запуска, и мы знаем, что сортировка вставки работает более эффективно для более коротких массивов
  • Однако он также не должен быть слишком коротким, так как следующим шагом является слияние этих запусков, более короткие запуски приведут к большему количеству запусков
  • Это выгодно, если N/min run имеет степень 2, так как это приведет к наилучшей производительности при сортировке слиянием.

Разбиение и сортировка пробегов:

Когда мы достигаем этого шага, у нас уже есть два значения – N и minrun

  • Флаг нисходящий – это сравнение между первыми 2 элементами, если остался только 1 элемент, то он устанавливается как false.
  • Затем другие элементы повторяются и проверяются, находятся ли они все еще в восходящем или “строгом” порядке убывания, пока не будет найден элемент, который не следует этому порядку.
  • После этого у нас будет запуск в восходящем или “строгом” нисходящем порядке. Если он находится в “строгом” порядке убывания, мы должны обратить его вспять.
  • Затем мы проверяем, чтобы убедиться, что длина пробега удовлетворяет минимальному пробегу. Если он меньше, мы компенсируем следующие пункты, чтобы он достиг минимального размера.

слияние трасс:

  • Сначала мы создадим временный прогон, имеющий размер наименьшего из объединенных прогонов.
  • После этого нам нужно скопировать самый короткий href=”https://en.wikipedia.org/wiki/Run_command”>запустите во временный. href=”https://en.wikipedia.org/wiki/Run_command”>запустите во временный.
  • Теперь мы пометим первый элемент большого и временного массива как текущую позицию.
  • На каждом следующем шаге мы будем сравнивать элементы в больших и временных массивах, а меньшие будут перемещены в новый отсортированный массив.
  • Нам нужно повторить описанный выше шаг до тех пор, пока один из массивов не закончится.
  • Наконец, мы добавим все остальные элементы в конец нового.

Реализация алгоритма Тима в Python:

Выход:

Анализ сложности алгоритма Python TimSort:

  • Наихудшая временная сложность: O(n log n)
  • Наилучшая временная сложность: O(n)
  • Средняя временная сложность: O(n log n)
  • Наихудшая пространственная сложность: O(n)

Преимущества Python Timsort:

  • Это стабильный алгоритм сортировки
  • Работает для данных в режиме реального времени

Надо Читать

  • Сортировка вставки в Python [Программа, алгоритм, Пример]
  • Алгоритм сортировки оболочки и программа на Python
  • Изучение различных способов сортировки списка списков в Python
  • Методы Сортировки С Использованием Python
  • КАК PYTHON СОРТИРУЕТ СПИСОК КОРТЕЖЕЙ

Вывод:

Это все об алгоритме Python TimSort. Встроенная функция < strong> sort() Python использует этот алгоритм, поскольку он обеспечивает стабильный подход к сортировке. Он быстрее других алгоритмов сортировки и может быть непосредственно реализован в python с помощью метода sort ().

What is Timsort?

Eric Mervin

Understanding probably one of the most commonly used sorting algorithms.

We all have used the array.sort() and sorted() functions in python, haven’t we? C’mon, we all have used it to save time! But have we ever tried to understand what algorithm is being executed in the background? In my quest to find out and understand the underlying algorithm, I came across an article on Wikipedia about Timsort.

Timsort, named after its inventor Tim Peters, has been the default sorting algorithm Python since version 2.3! Despite all this, Timsort is still a very obscure sort. Still, many students and engineers are unaware of this sort and how it works! So let’s try and understand how this algorithm works.

Timsort and its History

Tim came up with this sorting algorithm in the year 2002 after realising that real-world data almost always contain blocks that are already sorted, either in the ascending order or the descending order. This was something that other sorting algorithms didn’t take into consideration. So his approach of sorting was to identify such blocks in the given dataset called runs and sort them further using Mergesort and Binary Insertion Sort.

But why Timsort?

After looking at the above table one might argue that Quicksort and Merge Sort both have the same average time complexity as Timsort, then what’s the need for Timsort? To begin with, if we take a look at the best time complexity, Timsort outperforms both, Quicksort and Mergesort. Not only that, at its worst, although it runs at a speed similar to that of Mergesort, it outperforms Quicksort!

Note: Quicksort is efficient for very large datasets but not for small datasets.

Okay, enough about time complexity. If we talk in terms of space complexity, Timsort has a complexity of O(n), which when compared to other algorithms like Quicksort that have a complexity O(1), suggests that maybe it lies on the more inadequate side of the spectrum.

Another criterion on which sorting algorithms are generally assessed is stability. What is stability? A sorting algorithm is said to be stable in nature when elements of the same value maintain their original order even after sorting. It is often required while sorting real-world data like sorting entries of names in a school-record etc.

When compared on paper, Heapsort also seems to be better than Timsort. It is an in-place sorting algorithm, has similar average and worst-case time complexities compared to Timsort, then why is Timsort still preferred as the default sorting algorithm? It is because Heapsort has a poor locality of reference. The operating system cannot predict the pointer’s next position as the pointer can either multiply or divide by 2.

Understanding Timsort

Timsort is a hybrid and adaptive algorithm. It uses both Binary Insertion Sort and Merge Sort to sort a list in an average time of O(n logn) but in the best case, it can sort the given dataset in O(n) time. It identifies already sorted chunks of the list first and uses these chunks to sort the remainder more efficiently.

Implementing Timsort

Implementing Timsort is a little difficult, and understanding it also is a little complex. To make it easier for me and you, let’s break down Timsort into 3 steps

1. Checking List Size

While checking the size of the list if we find that the size of the list is less than 64 elements, Timsort will directly apply Binary Insertion Sort. But what’s the use of learning about a new sort if we're going to just apply an Insertion sort you might ask! Yes yes, we are discussing Timsort but, it has been found that Binary Insertion Sort or Insertion Sort, in general, is highly efficient and fast on a list whose size is in the range of 23–64 elements but quite slow on lights or larger size.

Binary Insertion Sort

Let’s take a look at a variation of Insertion Sort, called Binary Insertion Sort.

In Binary Insertion Sort, we use the normal binary search to find the correct index in the sorted section of the list to insert the selected unsorted element at each iteration, unlike the standard Insertion Sort that uses linear search to do the same. Further, the normal Insertion Sorting takes O(n) comparisons in the worst case, but this is reduced to O(n logn) when Binary Insertion Sort is used.

But what do we do if the size of the list is more than 64 elements? Simple, we move onto Step 2.

2. Finding Runs in the List

What are runs? In simple terms, they are blocks of the given list. A natural run is a block of the list in which all the elements are either strictly increasing or decreasing. We look for such runs in the list because we don’t have to sort them. The increasing runs can be simply merged with the next run but the decreasing runs are first blindly reversed, then merged with the next run.

I hate to break it to you, but everything isn’t so straightforward. During the first pass of the list, the algorithm while looking for runs also calculates the minimum run size and this is given the term minrun. The algorithm chooses the value of minrun from the range of 32–64 inclusive because Binary Insertion Sort is faster in lists of smaller size.

Furthermore, the value of minrun is generally equal to or nearly less than a power of 2, because merging lists of such size is more efficient. We’ll look more into it while learning about the implementation of Timsort.

3.a Merging the Sorted Runs

After finding runs in the list that are of size greater than or equal to minrun, Timsort moves on to perform Merge Sort on these sorted runs. However, Timsort has to maintain stability while merging the runs.

To ensure that the algorithm is stable, Timsort as when it finds a run in the list, it adds that run into a stack.

During merging, the Timsort has to balance two competing needs. First, we would have to delay the merging process as much as possible so that we can exploit patterns that might come up later in the list. But at the same time, merging the runs as soon as possible to exploit the run just found, which is still high in the memory hierarchy.

To balance these two things out, unlike a normal stack where only the top entries are considered, Timsort considers the top three entries (runs) in the stack. And in doing so, creates two rules that must hold of those items:

  1. A > B + C
  2. B > C

Now the Merge Sort that is followed to merge two runs in Timsort is again, yes, you guessed it right, a variation of the general Merge Sort called In-place Merge Sort. It is also because merging two adjacent runs of different lengths and maintaining their stability is hard. In In-place Merge Sort, instead of making a new list of size n+m (assuming that n and m are the sizes of the two runs), a temporary copy of the smaller list (say n < m) is made and the larger run is shifted by n places.

3.b Galloping

Timsort has another optimisation in the form of Galloping. If the algorithm finds that if one of the two runs is “winning” continuously for some time then instead of pushing elements one by one, it pushes elements as a chunk.

Consider the above two lists. We notice that elements from A[0:4] are all smaller than B[1], so checking for each element will be very inefficient. So when Timsort enters into galloping mode, if binary searches for the position where B[1] can fit in list A. This way the algorithm can move the entire chunk of A[0:4] into place. Then the algorithm binary searches for the correct position of A[0] in B.

But it has been noticed that galloping is not worth it if the correct position for B[0] is very close to the beginning of A (or vice versa), so if that is the case then the algorithm exits gallop mode quickly. Also, the algorithm only enters galloping mode after a certain number of consecutive A-only or B-only wins.

Conclusion

Timsort is a very fast and stable sort, but more importantly, it is optimised or rather should I say it is designed with keeping the real-world data sets in mind. Are there faster and better sorting algorithms? Probably yes. Can Timsort be used in every situation? Maybe not. But in the end, it is an optimised approach to solving a few dataset problems.

Even after all this research I still believe there is so much more to this sorting algorithm that I haven’t figured out yet!

Timsort — самый быстрый алгоритм сортировки, о котором вы никогда не слышали

Timsort: Очень быстрый, O(n log n), стабильный алгоритм сортировки, созданный для реального мира, а не для академических целей.

Timsort — это алгоритм сортировки, который эффективен для реальных данных, а не создан в академической лаборатории. Tim Peters создал Timsort для Python в 2001 году.

Timsort сначала анализирует список, который он пытается отсортировать, и на его основе выбирает наилучший подход. С момента его появления он используется в качестве алгоритма сортировки по умолчанию в Python, Java, платформе Android и GNU Octave.

Нотация Big O для Timsort — это O(n log n). Чтобы узнать о нотации Big O, прочтите это.

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

Peters разработал Timsort для использования уже упорядоченных элементов, которые существуют в большинстве реальных наборов данных. Он называет эти упорядоченные элементы «natural runs» (естественные пробеги). Они итеративно перебирают данные, собирая элементы в пробеги и одновременно объединяя несколько этих пробегов в один.

Если массив (array), который мы пытаемся отсортировать, содержит менее 64 элементов, Timsort выполняет сортировку вставкой.

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

Просматривать элементы по одному

Построить отсортированный список, вставляя элемент в нужное место

Вот таблица, показывающая, как сортировка вставкой сортирует список [34, 10, 64, 51, 32, 21].

В данном случае мы вставляем только что отсортированные элементы в новый подмассив (sub-array), который начинается от начала массива.

Вот gif, показывающий сортировку вставкой:

Больше о пробегах

Если список больше 64 элементов, то алгоритм сделает первый проход (pass) по списку в поисках частей, которые строго возрастают или убывают. Если какая-либо часть является убывающей, то она будет изменена.

Таким образом, если пробег уменьшается, он будет выглядеть следующим образом (пробег выделен жирным шрифтом):

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

Minrun — это размер, который определяется на основе размера массива. Алгоритм выбирает его таким образом, чтобы большинство пробегов в произвольном массиве были или становились длиной minrun. Слияние двух массивов более эффективно, когда число пробегов равно или чуть меньше степени числа 2. Timsort выбирает minrun, чтобы попытаться обеспечить эту эффективность, убедившись, что minrun равен или меньше степени числа 2.

Алгоритм выбирает minrun из диапазона от 32 до 64 включительно, таким образом, чтобы длина исходного массива при расчете была меньше или равна степени числа 2.

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

Итак, если minrun равен 63, а длина пробега равна 33, вы выполняете вычитание: 63-33 = 30. Затем вы берете 30 элементов из run[33], и делаете сортировку вставкой для создания нового пробега.

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

Слияние

Теперь Timsort использует сортировку слиянием, чтобы объединить пробеги. Однако Timsort следит за тем, чтобы сохранить стабильность и баланс слияния во время сортировки.

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

Когда Timsort находит пробеги, он добавляет их в стек. Простой стек выглядит следующим образом:

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

Timsort пытается сбалансировать две конкурирующие задачи при сортировке слиянием. С одной стороны, мы хотели бы отложить слияние на как можно дольше, чтобы использовать паттерны, которые могут появиться позже, но еще больше нам хотелось бы произвести слияние как можно быстрее, чтобы воспользоваться тем, что только что найденный пробег все еще находится наверху в иерархии памяти. Мы также не можем откладывать слияние «слишком надолго», потому что на запоминание еще не объединенных пробегов расходуется память, а стек имеет фиксированный размер.

Чтобы добиться компромисса, Timsort отслеживает три последних элемента в стеке и создает два правила, которые должны выполняться для этих элементов:

Где A, B и C — три самых последних элемента в стеке.

По словам Tim Peters:

Хорошим компромиссом оказалось то, что сохраняет два варианта для записей в стеке, где A, B и C — длины трех самых правых еще не объединенных частей.

Обычно объединить соседние пробеги разной длины очень сложно. Еще сложнее то, что мы должны поддерживать стабильность. Чтобы обойти эту проблему, Timsort выделяет временную память. Он помещает меньший (называя оба пробега A и B) из двух побегов в эту временную память.

Galloping*

*Модификация процедуры слияния подмассивов

Пока Timsort объединяет A и B, обнаруживается, что один пробег «выигрывает» много раз подряд. Если бы оказалось, что A состоял из гораздо меньших чисел, чем B, то A оказался бы на прежнем месте. Слияние этих двух пробегов потребовало бы много работы c нулевым результатом.

Чаще всего данные имеют некоторую уже существующую внутреннюю структуру. Timsort предполагает, что если многие значения пробега A меньше, чем значения пробега B, то, скорее всего, A будет и дальше содержать меньшие значения, чем B.

Затем Timsort переходит в режим galloping. Вместо того чтобы сверять A[0] и B[0] друг с другом, Timsort выполняет бинарный поиск соответствующей позиции b[0] в a[0]. Таким образом, Timsort может полностью переместить A. Затем Timsort ищет соответствующее местоположение A[0] в B. После этого Timsort также может полностью перемещает B.

Давайте посмотрим на это в действии. Timsort проверяет B[0] (который равен 5) и, используя бинарный поиск, ищет соответствующее место в A.

Итак, B[0] находится в конце списка A. Теперь Timsort проверяет A[0] (который равен 1) в правильном месте B. Итак, мы ищем, где находится число 1. Это число находится в начале B. Теперь мы знаем, что B находится в конце A, а A — в начале B.

Оказывается, что действие не имеет смысла, если подходящее место для B[0] находится очень близко к началу A (или наоборот), поэтому режим gallop быстро завершается, если он не приносит результатов. Кроме того, Timsort принимает это к сведению и усложняет вход в режим gallop, увеличивая количество последовательных «побед» только в A или только в B. Если режим gallop приносит результаты, Timsort облегчает его повторный запуск.

Если говорить коротко, Timsort делает две вещи невероятно хорошо:

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

Создает возможность поддерживать стабильную сортировку

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

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

Если вы хотите увидеть оригинальный исходный код Timsort во всей его красе, посмотрите его здесь. Timsort официально реализован на C, а не на Python.

Timsort фактически встроен прямо в Python, поэтому этот код служит только в качестве пояснения. Чтобы использовать Timsort, просто напишите следующее:

Если вы хотите узнать, как работает Timsort, и понять его суть, я настоятельно рекомендую вам попробовать применить его самостоятельно!

Эта статья основана на оригинальном вступлении Tim Peters к Timsort, которое можно найти здесь.

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

Русские Блоги

Timsort-адаптивный, стабильный и эффективный алгоритм сортировки

При использовании алгоритма сортировки, поставляемого с Python, или алгоритма сортировки на Java, мне интересно, какой высокопроизводительный алгоритм сортировки они используют. После изучения, изучения и ознакомления с информацией они пришли к следующему пониманию.

Введение в Timsort

Timsort — это гибридный, стабильный и эффективный алгоритм сортировки, полученный на основе сортировки слиянием и сортировки вставкой, разработанный для хорошей обработки множества реальных данных. Он был реализован Тимом Петерсом в 2002 году и использовался в языке программирования Python.Алгоритм находит подпоследовательности отсортированных данных и использует эти знания для более эффективной сортировки остальных. Это делается путем слияния идентифицированных подпоследовательностей (называемых запусками) с существующими запусками до тех пор, пока не будут выполнены определенные условия.Начиная с версии 2.3, Timsort является стандартным алгоритмом сортировки Python. Сегодня Timsort является алгоритмом сортировки по умолчанию для платформ Python, Java, Android и GNU Octave.

думал

Согласно анализу данных, который необходимо сортировать на самом деле, большая часть данных обычно является частью отсортированных блоков данных. Timsort использует эту функцию.Timsort называет эти отсортированные блоки данных «запуском», и мы можем рассматривать их как «разделы» один за другим. При сортировке Timsort выполняет итерацию элементов данных и помещает их в разные прогоны. В то же время для этих прогонов они объединяются по правилам только в один прогон, и единственный оставшийся прогон является результатом сортировки.
Другими словами, он предназначен для анализа сортируемых данных в соответствии с их собственными характеристиками,Разделите отсортированные (в порядке или в обратном порядке) подпоследовательности на разделы выполнения. Конечно, этот запуск раздела также имеет определенные ограничения, то есть minrun будет сгенерирован в соответствии с последовательностью. Если исходный запуск меньше, чем длина minrun, используйте Сортировка вставкой расширяет прогон до тех пор, пока не будет выполнено условие, а затем использует сортировку слиянием для объединения нескольких прогонов.
timsort1
timsort2

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

Шаги алгоритма

  • Генерация minrun в соответствии с размером последовательности ( Зачем мне минран? Я расскажу об этом при слиянии)
    • Minrun — это значение условия для разделения прогона. Если размер прогона меньше этого minrun, он должен быть расширен, и следующие элементы заполняются в прогоне до тех пор, пока он не будет соответствовать требованиям и не станет равен minrun. Итак, объясните метод выбора minrun: если длина сортируемой последовательности равна n, мы сгенерируем всего ⌈nminrun⌉ \ lceil \ frac \ rceil⌈minrunn⌉Первоначальный запуск.
      • ⌈nminrun⌉\lceil\frac\rceil⌈minrunn— это в точности целая степень двойки, процесс слияния будет очень "идеальным", что может быть выражено в виде полного двоичного дерева.
      • ⌈nminrun⌉\lceil\frac\rceil⌈minrunn⌉ Немного больше, чем некоторая степень целого числа 2, на заключительном этапе алгоритма будет комбинация сверхдлительного и ультракороткого прогонов, что является очень плохой ситуацией.
        Следовательно, мы выберем minrun, чтобы ⌈nminrun⌉ \ lceil \ frac \ rceilceminrunn⌉ — это просто целая степень 2 или число, немного меньшее определенной целой степени 2.
      • 189: 10111101, возьмите первые шесть старших битов флага как 101111 (47), а последние два бита как 01, так что minrun будет 47 + 1 = 48, ⌈nminrun⌉ \ lceil \ frac \ rceil⌈minrunn⌉ = 4 Соответствуют условиям.
      • 976: 11 1101 0000, первые шесть старших битов флага — 111101 (61), а последние несколько бит — 0000, поэтому minrun — 61, ⌈nminrun⌉ \ lceil \ frac \ rceil⌈minrunn⌉ = 16 удовлетворяют условиям.
      • X>Y+ZX &gt; Y + ZX>Y+Z
      • Y>ZY &gt; ZY>Z
        При достижении конца данных Timsort многократно объединяет два прогона в верхнюю часть стека до тех пор, пока не останется только один полных данных, и два вышеуказанных правила не будут соблюдены одновременно.
        merge
        На практике Timsort объединяет два соседних прогона для временного хранения свободного пространства. Размер временного хранилища равен размеру меньшего из двух прогонов. Алгоритм Timsort сначала копирует меньший прогон в это временное хранилище, а затем использует пространство, изначально сохраненное для двух прогонов, для хранения объединенного прогона.
        merge2
        Алгоритм слияния заключается в использовании простой сортировки вставкой, последовательного сравнения слева направо или справа налево, а затем слияния двух прогонов. Для повышения эффективности Timsort использует двоичную сортировку слиянием (двоичную сортировку слиянием). То есть сначала используйте двоичный поиск, чтобы найти вставленную позицию, а затем вставьте ее. ( Сравнение в python очень дорогое, сравнение дороже, чем на мобильных устройствах, поэтому, если вы можете уменьшить сравнение, вы можете уменьшить сравнение )

      Galloping mode

      В режиме Galloping алгоритм ищет первый элемент другого прогона за один прогон. Комбинируя начальный элемент со вторыми 2k − 12k-12 другого прогонаk−1 элементы (то есть 1, 3, 5 . ) сравниваются с завершенными, чтобы получить диапазон элементов, в котором расположен начальный элемент. Это сокращает диапазон двоичного поиска, тем самым повышая эффективность. Если обнаруживается, что эффективность галопирования ниже, чем бинарного поиска, выйдите из режима галопирования.
      Например, мы хотим объединить два прогона X и Y, а X — меньший прогон, а X и Y уже отсортированы отдельно, скопируйте X в кэш-память Как показано на рисунке ниже.
      Galloping mode1
      Двоичный поиск найдет первый элемент x в X, который больше Y [0]. Когда x найден, элементы до x могут быть проигнорированы при слиянии. Точно так же вы также можете найти первый элемент y, больший, чем X [-1] (самый большой элемент X) в Y. Когда y найден, элементы после y могут быть проигнорированы при слиянии. Этот поиск может быть случайным Эффективность в цифрах не очень высока, но очень эффективна в других ситуациях.
      Galloping mode2
      Когда алгоритм достигает минимального порога min_gallop, алгоритм переключается в режим Galloping, пытаясь использовать те элементы в данных, которые можно напрямую отсортировать. Галоп полезен только тогда, когда начальный элемент одного забега не является одним из первых семи элементов другого забега. Это означает, что начальный порог равен 7.
      Чтобы избежать недостатков режима Galloping, функция слияния регулирует порог. Если выбранный элемент принадлежит к тому же массиву ранее возвращенных элементов, min_gallop уменьшается на 1. В противном случае значение увеличивается на 1, что предотвращает возврат в режим галопирования. В случае случайных данных значение min_gallop станет настолько большим, что режим Gallop никогда больше не повторится.

      Временная сложность алгоритма

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

      Код

      Реализованный ниже код не является конкретным и полным timsort, а является упрощенным, в соответствии с приблизительной реализацией идей Timsort. Для получения конкретного и полного кода обратитесь к разделу сортировки в исходном коде Python или в исходном коде в JDK1.8, или обратитесь кОфициальный исходный код Timsort на C:

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

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