Каталог статей
Предисловие
Алгоритм сортировки — один из самых основных алгоритмов в разделе «Структуры данных и алгоритмы».
Алгоритмы сортировки можно разделить на внутреннюю сортировку и внешнюю сортировку . Внутренняя сортировка предназначена для сортировки записей данных в памяти, а внешняя сортировка связана с тем, что отсортированные данные очень велики и не могут вместить все отсортированные записи одновременно. нужен доступ к памяти.
Изучив предыдущие 11 статей, мы получили глубокое понимание десяти классических алгоритмов сортировки. В этой статье будут обобщены, сравнены и проанализированы эти десять классических алгоритмов.
1. Классификация десяти лучших классических алгоритмов сортировки
Десять распространенных алгоритмов сортировки можно разделить на две большие категории :
Сортировка нелинейным сравнением времени : определение относительного порядка между элементами посредством сравнения, поскольку его временная сложность не может превышать O (nlogn) O(nlogn)O ( n log n ) , поэтому это называется сортировкой нелинейного сравнения времени .
Сортировка без сравнения за линейное время : она не определяет относительный порядок между элементами посредством сравнения. Она может преодолевать нижнюю границу времени сортировки на основе сравнения и выполняться за линейное время , поэтому она называется сортировкой без сравнения за линейное время. .
2. Связанные понятия
- Стабильный : если изначально a находится перед b и a=b, после сортировки a все равно будет перед b;
- Нестабильный : если a изначально находится перед b и a=b, a может появиться после b после сортировки;
- Внутренняя сортировка : все операции сортировки выполняются в памяти;
- Внешняя сортировка : поскольку данные слишком велики, они помещаются на диск, и сортировка может выполняться только посредством передачи данных между диском и памятью;
- **Временная сложность: **Временная сложность означает, что при расчете временной сложности рассчитывается не конкретное время работы программы, а количество раз, когда алгоритм выполняет операторы.
- Пространственная сложность . Пространственная сложность — это мера объема памяти, которую алгоритм временно занимает во время работы.
3. Краткое описание десяти лучших классических алгоритмов
Глоссарий :
- n: размер данных
- k: количество «ведёр»
- На месте: занимает постоянную память и не занимает дополнительную память.
- Не на месте: занимает дополнительную память
4. Дополнительный контент
4.1 Разница между сортировкой сравнения и сортировкой без сравнения
-
Обычная быстрая сортировка, сортировка слиянием, сортировка кучей, пузырьковая сортировка и т. д. относятся к сортировке сравнения . В конечном результате сортировки порядок элементов зависит от сравнения между ними. Каждое число необходимо сравнить с другими числами, чтобы определить его положение.
При такой сортировке, как пузырьковая сортировка , размер задачи равен n, а поскольку требуется n раз сравнения, средняя временная сложность равна O ( n 2 ) O(n^2).На2 ). Притакой сортировке, каксортировка слиянием и быстрая сортировкауменьшается доlog logметода «разделяй и властвуй»log n log , поэтому средняя временная сложность равна O ( nlogn ) O (nlogn)О ( п лог н ) .Преимущество сравнительной сортировки в том, что она подходит для данных любого размера и может сортироваться независимо от распределения данных. Можно сказать, что сортировка сравнением подходит для всех ситуаций, требующих сортировки.
-
Сортировка подсчетом, поразрядная сортировка и сортировка сегментами являются несравнительной сортировкой . Несравнительная сортировка сортирует, определяя, сколько элементов должно предшествовать каждому элементу. Для массива arr подсчитайте, сколько элементов находится до arr[i], тогда позиция arr[i] в отсортированном массиве определяется однозначно.
Несравнительная сортировка требует только определения количества существующих элементов перед каждым элементом, и все это можно решить за один обход. Временная сложность алгоритма O ( n ) O(n)На ) .Несравнительная сортировка имеет наименьшую временную сложность, но требует места для определения уникальной позиции. Поэтому существуют определенные требования к масштабу и распределению данных.
4.2. Действительно ли стабильные алгоритмы стабильны?
Сама идея алгоритма не зависит от языка программирования, поэтому, когда вы пишете код для реализации алгоритма, многие детали можно обрабатывать по-другому. Использование нестабильного алгоритма. Независимо от того, как вы пишете код во время конкретной реализации, конечная позиция одного и того же элемента всегда неопределенна (она может не меняться, а может и меняться).
Стабильный алгоритм сортировки будет стабильным, если вы хорошо обработаете детали во время конкретной реализации , но результаты, полученные, если некоторые детали не будут обработаны, все равно нестабильны.
4.3 Значение стабильности
Если мы имеем дело с простой числовой сортировкой, тогда стабильность не имеет большого значения. Например, в последовательности 1 2 3 3 4, если позиции первых 3 и вторых 3 изменяются неоднократно после повторного выполнения метода сортировки, но для вышестоящего приложения, которое вызывает метод сортировки для получения результата сортировки, результат по-прежнему 1 2 3 3 4, а порядок 3 не имеет значения.
Если отсортированный контент — это лишь некий числовой атрибут сложного объекта, то стабильность все равно будет бессмысленной (стоимость так называемой операции обмена уже включена в стоимость алгоритма. Если вам эта стоимость не нравится, лучше использовать алгоритм преобразования?)
Если отсортированное содержимое представляет собой несколько числовых свойств сложного объекта, но исходный порядок не имеет смысла, то стабильность все равно будет бессмысленной.
Так при каких обстоятельствах «стабильность» алгоритма сортировки становится значимой?
Например, учащиеся в классе были отсортированы по их идентификаторам учащихся. Теперь я хочу, чтобы они были отсортированы от самого маленького к самому большому по возрасту. Если они одного возраста, их необходимо отсортировать в порядке возрастания по идентификаторам учащихся. Итак, возникает вопрос: если выбранный вами метод сортировки по возрасту нестабилен, не перепутаются ли числа учащихся в группе учеников одного возраста после сортировки ? Вам придется снова отсортировать эту группу учеников одного возраста? своим студенческим номерам. Если это стабильный алгоритм сортировки, мне нужно сортировать только по возрасту.
(Сортировка по одному ключу, а затем сортировка по другому ключу. Результат сортировки по первому ключу можно использовать для сортировки по второму ключу. Сортируемый контент представляет собой несколько числовых атрибутов сложного объекта, и его исходный порядок имеет то есть нам нужно сохранить смысл исходной сортировки на основе вторичной сортировки, а затем нам нужно использовать стабильный алгоритм).
Что означает «стабильность» алгоритма сортировки? Это по-прежнему зависит от сценария приложения. Во многих случаях это не имеет реального значения, но в некоторых случаях оно имеет очень важное значение.
Существует множество алгоритмов, которые сейчас могут показаться вам ничем, но их стабильность очень важна в условиях облачных вычислений больших данных. Например, при сортировке товаров на Taobao по объему продаж, цене и другим условиям на его сервере данных имеется много данных. Поэтому при обнаружении был использован алгоритм сортировки с плохой стабильностью, такой как сортировка кучей. в худшем случае эффект сортировки будет очень плохим, что серьезно повлияет на производительность сервера и ухудшит взаимодействие с пользователем.
4.4 Дополнение к временной сложности
Обычно обсуждаемая временная сложность — это временная сложность в худшем случае. Причина этого в том, что временная сложность наихудшего случая — это верхняя граница времени, в течение которого алгоритм будет работать на любом входном экземпляре, что гарантирует, что алгоритм не будет работать дольше, чем любой другой .
Средняя временная сложность относится к ожидаемому времени работы алгоритма, если все возможные входные экземпляры происходят с одинаковой вероятностью . Пусть вероятность каждой ситуации равна пи-пи.p i , средняя временная сложность равнаsum (pi ∗ f (n)) sum(pi*f(n))с у м ( п я∗ф ( н ))。
4.5 Дополнение к пространственной сложности
Используя пространственную сложность программы, вы можете предварительно оценить объем памяти, необходимой для запуска программы. Пространство памяти, необходимое во время выполнения программы, состоит из следующих двух частей:
(1) Фиксированная часть: размер этой части пространства не имеет ничего общего с количеством и значением входных/выходных данных. В основном это пространство, занимаемое пространством инструкций (т.е. пространством кода), пространством данных (константы, простые переменные) и т. д. Эта часть представляет собой статичное пространство.
(2) Пространство переменных: эта часть пространства в основном включает в себя динамически выделяемое пространство и пространство, необходимое для рекурсивного стека. Размер этой части пространства связан с алгоритмом.
Пространственная сложность учитывает часть переменного пространства .
Заключение
Сегодняшний обмен заканчивается здесь! Если вы считаете статью хорошей, вы можете поддержать ее трижды .
Вы также можете обратить внимание, чтобы не найти меня в будущем!
На главной странице Crossoads много интересных статей . Друзья приветствуются. Ваша поддержка — мотивация автора двигаться вперед!
Позвольте мне дать вам предварительное представление об алгоритме сортировки: https://blog.csdn.net/2301_80191662/article/details/142211265.
Сортировка прямой вставкой: https://blog.csdn.net/2301_80191662/article/details/142300973.
Сортировка холма : https://blog.csdn.net/2301_80191662/article/details/142302553
Сортировка прямым выбором: https://blog.csdn.net/2301_80191662/article/details/142312028
Сортировка кучей: https://blog. csdn.net/ 2301_80191662/article/details/142312338
Пузырьковая сортировка: https://blog.csdn.net/2301_80191662/article/details/142324131
Быстрая сортировка: https://blog.csdn.net/2301_80191662/article/details/ 142324307
Сортировка слиянием: https://blog.csdn.net/2301_80191662/article/details/142350640
Сортировка по счетчику: https://blog.csdn.net/2301_80191662/article/details/142350741
Сортировка сегментами: https://blog. csdn.net/2301_80191662/article/details/142375338
Сортировка по основанию: https://blog.csdn.net/2301_80191662/article/details/142375592
Сводка и анализ десяти лучших классических алгоритмов сортировки: https://blog.csdn. net/2301_80191662/article/details/142211564
Справочное содержание: Если я вас спрошу: Что означает «стабильность» алгоритма сортировки? Как ты ответишь? (qq.com)