Сортировка Основные понятия и определения
В словарях слово "сортировка"(sorting) определяется как "распределение, отбор по сортам; деление на категории, сорта, разряды", однако программисты обычно используют это слово в более узком смысле, обозначая им перегруппировку элементов в некотором определенном порядке. Этот процесс, пожалуй, следовало бы назвать не сортировкой, а упорядочиванием (ordering) или ранжированием (sequencing). Однако слово "сортировка" уже прочно вошло в программистский жаргон, поэтому мы будем в дальнейшем использовать слово "сортировка» в узком смысле - "сортировка по порядку". Зачем рассматриваются алгоритмы сортировки?
- процесс сортировки может быть осуществлен различными алгоритмами. Так как каждый из алгоритмов имеет свои преимущества и недостатки, то выбор алгоритма должен осуществляться исходя из конкретной постановки задачи;
- большое разнообразие алгоритмов сортировки приводит к необходимости анализа этих алгоритмов (их производительности);
- на примере алгоритмов сортировки легко проиллюстрировать, как путем усложнения алгоритмов (несмотря на существование простых и очевидных методов) добиться в выигрыше эффективности.
Введем некоторые понятия и обозначения.
Частичным порядком на множествеS называется такое бинарное отношениеR, что для любыха, b,с изS выполняются следующие условия:
- аRа(R— рефлексивно);
- аRb иbRс →аRс (R— транзитивно);
- аRbиbRa→ a = b(К — антисимметрично).
Пример 1.
Отношение ≤ на множестве целых чисел (1 ≤ 2 ≤ … ≤ n).
Пример 2.
Отношениевключения множеств:
{0}{1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}.
Линейным или полным порядком на множествеS называется такой частичный порядокR наS, для которого для любых двух элементова иb изS выполняется либоaRbлибоaRb.
Отношение ≤ на множестве целых чисел — линейный порядок.
Отношение(включения множеств) — нет (например, нельзя связать отношением элементы {2} и {3}) .
Сформулируем теперь задачу сортировки.
Пусть дана последовательность из п элементовa1 ,а2,…,ап, которые назовем записями, выбранных из множества, на котором задан линейный порядок.
Каждая запись aj имеет ключkj , который и управляет процессом сортировки (помимо ключа, запись может иметь некоторую дополнительную информацию, которая не влияет на процесс сортировки, но всегда присутствует в этой записи).
Требуется найти такую перестановку этихп записей, после которой ключи расположились бы в неубывающем порядке:
≤≤ … ≤ .
Алгоритм сортировки называется устойчивым, если в процессе сортировки относительное расположение элементов с одинаковыми ключами не изменяется (предполагается, что элементы уже были отсортированы по некоторому вторичному ключу):
≤и
Хороший алгоритм сортировки затрачивает на сортировку п записей время порядкаnlogп .
Существуют более простые методы упорядочивания, которые затрачивают на сортировку время порядка n2(эти методы легко понимать, они более коротки и для малых значенийп часто оказываются более быстродействующими).
Все алгоритмы сортировки можно разбить на три группы:
- сортировка с помощью включения (byinsertion);
- сортировка выбором (byselection);
- сортировка с помощью обменов (byexchange).