Найти в Дзене

Алгоритмы сортировки, часть 1 - начнем с простого

Оглавление

Народ, всем привет. Сортировка это одна из самых распространённых задач в программировании, хоть многие в начале пути этого не замечают. Но почти в любом приложении, будь то база данных, веб-сервис или мобильное приложение, часто требуется упорядочить данные, по алфавиту, по числам, по дате и т.д. И именно поэтому изучение алгоритмов, в том числе сортировки, позволяют организовать данные в определённом нужном нам порядке, как-то их обработать и все такое прочее.

Это пока вы молоды вы учитесь писать Hello World и пишете свой первый калькулятор, где не нужны подобные алгоритмы. А потом, устроившись на настоящую работу, где чаще всего работают с массивами данных (причем с большими) начинается изобретение велосипеда и придумывание методов сортировки самостоятельно. А они уже все давно написаны. Чаще всего сортировку применяют в:

  • в банковских, финансовых организациях, при работе с цифрами
  • поисковых системах, упорядочивание результатов по релевантности.
  • интернет-магазинах, сортировка товаров по цене, рейтингу, популярности.
  • базах данных, индексирование, ускорение запросов.
  • графика, глубинная сортировка (Z-ordering).
-2

Что такое сортировка?

Сортировка — это процесс упорядочивания элементов списка или массива по определённому критерию. Например, числа можно отсортировать по возрастанию или убыванию, строки — в алфавитном порядке, а записи — по дате или имени.

Алгоритмы сортировки делятся на несколько категорий, в зависимости от сложности и эффективности (скорости, затрат памяти и т.д.) Сегодня мы поговорим про самые простые, но на них проще всего учиться и понять суть. В следующих частях мы продолжим уже с более эффективными и востребованными алгоритмами.

1. Простые (обучающие):

  • Сортировка пузырьком (Bubble Sort)
  • Сортировка вставками (Insertion Sort)
  • Сортировка выбором (Selection Sort)

2. Эффективные (используются на практике):

  • Быстрая сортировка (Quick Sort)
  • Сортировка слиянием (Merge Sort)
  • Пирамидальная сортировка (Heap Sort)

3. Специализированные:

  • Поразрядная сортировка (Radix Sort)
  • Подсчётом (Counting Sort)
  • Bucket Sort (сортировка корзинами)
-3
Если Вам нравятся наши статьи, и вы хотите отблагодарить автора (на развитие канала), нам будет очень приятно!

Сортировка пузырьком

Сортировка пузырьком одна из самых малоэффективных, зато простых, она просто проходит по массиву многократно, сравнивая соседние элементы и меняя их местами, если они стоят в неправильном порядке (например, если сортировка по возрастанию и левый элемент больше правого, меняет их местами). В результате на каждой итерации крупнейший (или наименьший) элемент "всплывает" в конец массива — как пузырёк в воде. Отсюда и название.

Давайте на примере, допустим, у нас есть массив: [5, 2, 4, 1, 3] и мы хотим отсортировать его по возрастанию.

Первая итерация:

  • сравниваем 5 и 2 → 5 > 2 → меняем → [2, 5, 4, 1, 3]
  • сравниваем 5 и 4 → 5 > 4 → меняем → [2, 4, 5, 1, 3]
  • сравниваем 5 и 1 → 5 > 1 → меняем → [2, 4, 1, 5, 3]
  • сравниваем 5 и 3 → 5 > 3 → меняем → [2, 4, 1, 3, 5]
  • теперь 5 — на своём месте.

Вторая итерация:

  • сравниваем 2 и 4 → 2 < 4 → ничего не делаем
  • сравниваем 4 и 1 → 4 > 1 → меняем → [2, 1, 4, 3, 5]
  • сравниваем 4 и 3 → 4 > 3 → меняем → [2, 1, 3, 4, 5]
  • (5 уже не трогаем)

Третья итерация:

  • сравниваем 2 и 1 → 2 > 1 → меняем → [1, 2, 3, 4, 5]
  • сравниваем 2 и 3 → уже порядок → ничего не делаем
  • сравниваем 3 и 4 → порядок → ничего не делаем

Четвёртая итерация:

  • сравниваем 1 и 2 → порядок → ничего не делаем
  • сравниваем 2 и 3 → порядок → ничего не делаем

Теперь массив отсортирован. У данной сортировки очень низкая эффективность, так как даже для такого маленького массива происходит слишком много итераций и сравнений. Поэтому, использовать данный алгоритм можно лишь для обучения (первое знакомство с сортировками, чисто попробовать) и для очень маленьких массивов. А вот если важна производительность лучше не надо.

-4

Сортировка вставками

Сортировка вставками работает по принципу, похожему на сортировку карт в руке: мы перебираем элементы по одному и вставляем каждый в нужное место среди уже отсортированных. Иными словами, на каждой итерации:

  • берётся очередной элемент из "неотсортированной части".
  • он сравнивается с элементами "отсортированной части" слева.
  • пока элемент меньше, происходит сдвиг, и в нужное место вставляется текущий элемент.

Теперь давайте на примере. Допустим, у нас есть массив [5, 2, 4, 1, 3]

Шаг 1: берем первый элемент – это 2 (ну 5 пропускаем, понятно)

  • Сравниваем с 5 → 2 < 5 → сдвигаем 5 вправо, вставляем 2 на его место → [2, 5, 4, 1, 3]

Шаг 2: берем следующий элемент - это 4

  • Сравниваем с 5 → 4 < 5 → сдвигаем 5
  • Сравниваем с 2 → 4 > 2 → остановка, тут все верно, поэтому вставляем 4 → [2, 4, 5, 1, 3]

Шаг 3: следующий элемент 1

  • Сравниваем с 5 → 1 < 5 → сдвигаем
  • Сравниваем с 4 → 1 < 4 → сдвигаем
  • Сравниваем с 2 → 1 < 2 → сдвигаем
  • Вставляем 1 в самое начало → [1, 2, 4, 5, 3]

Шаг 4: последний элемент 3

  • Сравниваем с 5 → 3 < 5 → сдвигаем
  • Сравниваем с 4 → 3 < 4 → сдвигаем
  • Сравниваем с 2 → 3 > 2 → остановка, вставляем 3 → [1, 2, 3, 4, 5]

Готово! Массив отсортирован. Данный алгоритм вполне жизнеспособен, и подходит для маленьких массивов (до 30-50 элементов) и когда нужна стабильная сортировка. Но все же, когда важна высокая производительность на случайно перемешанных данных и у вас большие объёмы данных, я не советую.

-5

Сортировка выбором

Сортировка выбором работает следующим образом. Мы каждый раз находим наименьший элемент в неотсортированной части массива и меняет его местами с первым элементом этой части. Повторяем процесс со следующей неотсортированной позицией, пока весь массив не будет отсортирован. Таким образом, сортировка разделяет массив на две части, левую — уже отсортированную, и правую — ещё нет.

Допустим, у нас есть все тот же массив [5, 2, 4, 1, 3]

  • Шаг 1: ищем минимальный среди [5, 2, 4, 1, 3] → это 1, и ставим его на первое место, то есть меняем 1 и 5 → [1, 2, 4, 5, 3]
  • Шаг 2: опять ищем минимальный среди уже оставшейся правой неотсортированной части [2, 4, 5, 3] → это 2. Он уже на месте, поэтому ничего не делаем
  • Шаг 3: ищем минимальный среди [4, 5, 3] → это 3, ставим его на первое место неотсортированной части, то есть меняем 4 и 3 → [1, 2, 3, 5, 4]
  • Шаг 4: ну и снова ищем минимальный среди [5, 4] → это 4, меняем 5 и 4 → [1, 2, 3, 4, 5]

Готово — массив отсортирован по возрастанию. Тут сложность все равно заключается в том, что каждый раз в правой неотсортированной части вам нужно будет делать «перебор» значений и искать минимальное. Но каждый раз уже в меньшем массиве, чем в предыдущий раз. Поэтому алгоритм также не эффективный, и подходит в основном для обучения.

-6

Хотите знать больше? Читайте нас в нашем Telegram – там еще больше интересного: новинки гаджетов, технологии, AI, фишки программистов, примеры дизайна и маркетинга.