---
title: Алгоритмы · часть 1
seo:
  title: Алгоритмы · часть 1 — C++ Developer
  description: Тема «Алгоритмы · часть 1» для собеседования C++ Developer. Что такое алгоритмы сортировки и какие вы знаете? Какие алгоритмы работы со строками знаете?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что такое алгоритмы сортировки и какие вы знаете?</strong> [#q-14bee738d69b810aba1adf780085bf88]

Алгоритмы сортировки — это методы организации коллекций данных в упорядоченном порядке, обычно по возрастанию или убыванию. Они являются фундаментальными инструментами в информатике, применяемыми для обработки и управления данными. Вот несколько основных типов алгоритмов сортировки&#58;

1. <strong>Сортировка пузырьком</strong> <code>&#40;Bubble Sort&#41;</code>&#58;
   Простейший алгоритм, который повторно проходит через список, сравнивает
   соседние элементы и меняет их местами, если они находятся в неправильном
   порядке.

1. <strong>Сортировка вставками</strong> <code>&#40;Insertion Sort&#41;</code>
   &#58; Строит итоговый отсортированный массив (или список) одним элементом за
   раз, вставляя каждый новый элемент в уже отсортированную часть массива.

1. <strong>Сортировка выбором</strong> <code>&#40;Selection Sort&#41;</code>
   &#58; Находит минимальный элемент из неотсортированной части массива и
   помещает его в конец отсортированной части.

1. <strong>Быстрая сортировка</strong> <code>&#40;Quick Sort&#41;</code>&#58;
   Выбирает опорный элемент, и перегруппирует элементы вокруг него, так что
   элементы меньше опорного оказываются перед ним, а большие — после. Процесс
   повторяется рекурсивно для подмассивов до и после опорного элемента.

1. <strong>Сортировка слиянием</strong> <code>&#40;Merge Sort&#41;</code>&#58;
   Разделяет массив на две части, рекурсивно сортирует их, а затем сливает в
   один отсортированный массив.

1. <strong>Кучная сортировка</strong> <code>&#40;Heap Sort&#41;</code>&#58;
   Преобразует массив в двоичную кучу, затем извлекает элементы из кучи один за
   другим, восстанавливая свойства кучи после каждого извлечения.

1. <strong>Сортировка Шелла</strong> <code>&#40;Shell Sort&#41;</code>&#58;
   Улучшенная версия сортировки вставками, использует последовательность шагов
   (интервалов), сокращая количество перемещений элементов на большие
   расстояния.

1. <strong>Поразрядная сортировка</strong> <code>&#40;Radix Sort&#41;</code>
   &#58; Сортирует числа путем обработки отдельных цифр. Функционирует от
   младших разрядов к старшим или наоборот.

:::note[Ссылки для изучения]

1. [7 способов сортировки массива на С++](https://proglib.io/p/7-sposobov-sortirovki-massivov-na-primere-s-s-illyustraciyami-2022-04-20)
   :::

---

## <strong>Какие алгоритмы работы со строками знаете?</strong> [#q-14bee738d69b81369498d0b3916abdd9]

Алгоритмы работы со строками — это методы обработки и анализа текстовых данных. Вот несколько основных алгоритмов, применяемых в обработке строк&#58;

{/* prettier-ignore */}
1. <strong>Поиск подстроки</strong>&#58;

    - <strong>Алгоритм Кнута-Морриса-Пратта</strong> <code>&#40;KMP&#41;</code>&#58; Эффективно ищет вхождения подстроки в строке, используя префиксную функцию для минимизации количества обратных шагов.

    - <strong>Алгоритм Бойера-Мура</strong>&#58; Использует суффиксные правила и информацию о встреченных символах для ускорения поиска подстроки.

    - <strong>Алгоритм Рабина-Карпа</strong>&#58; Использует хэш-функцию для быстрого сравнения подстрок, что позволяет эффективно искать множество шаблонов одновременно.

1. <strong>Сортировка строк</strong>&#58;

    - <strong>Поразрядная сортировка</strong> <code>&#40;Radix Sort&#41;</code>&#58; Особенно эффективна для сортировки строк, так как обрабатывает символы строк начиная с младших разрядов.

    - <strong>Сортировка слиянием</strong>&#58; Хорошо подходит для сортировки больших массивов строк из-за своей стабильности и эффективности на больших данных.

1. <strong>Динамическое программирование в строках</strong>&#58;

    - <strong>Расстояние Левенштейна</strong> <code>&#40;редакционное расстояние&#41;</code>&#58; Вычисляет минимальное количество операций вставки, удаления и замены, необходимых для преобразования одной строки в другую.

    - <strong>Нахождение наибольшей общей подпоследовательности</strong> <code>&#40;LCS&#41;</code>&#58; Определяет длину наибольшей последовательности символов, которая появляется в обеих строках в том же порядке.

1. <strong>Палиндромы</strong>&#58;

    - <strong>Алгоритмы для определения наибольшей палиндромической подстроки</strong>&#58; Используют различные методы, включая динамическое программирование и расширение вокруг центра, для нахождения самых длинных палиндромов в строке.

1. <strong>Парсинг и лексический анализ</strong>&#58;

    - <strong>Регулярные выражения</strong>&#58; Предоставляют мощные средства для поиска и извлечения данных из строк с помощью заданных паттернов.

:::note[Ссылки для изучения]

1. [Основные алгоритмы для работы со строками в C++](https://proglib.io/p/must-have-algoritmy-dlya-raboty-so-strokami-na-c-2020-03-30)
   :::

---

## <strong>Какие алгоритмы на графах знаете?</strong> [#q-14bee738d69b81228769e99c68e7b458]

Алгоритмы на графах — это методы, используемые для анализа и решения задач в структурах данных, представляющих графы. Вот несколько ключевых алгоритмов, используемых для различных операций на графах&#58;

{/* prettier-ignore */}
1. <strong>Поиск в глубину</strong> <code>&#40;DFS&#44; Depth&#45;First Search&#41;</code>&#58;

    - Обходит граф, углубляясь как можно дальше, прежде чем отступать.

1. <strong>Поиск в ширину</strong> <code>&#40;BFS&#44; Breadth&#45;First Search&#41;</code>&#58;

    - Обходит граф по слоям, начиная с исходной вершины и распространяясь равномерно во все стороны.

1. <strong>Поиск кратчайшего пути</strong>&#58;

    - <strong>Алгоритм Дейкстры</strong>&#58; Находит кратчайшие пути от одной вершины до всех других в графе с неотрицательными весами рёбер.

    - <strong>Алгоритм Беллмана-Форда</strong>&#58; Решает ту же задачу, что и Дейкстра, но работает и с отрицательными весами рёбер.

    - <strong>Алгоритм Флойда-Уоршелла</strong>&#58; Находит кратчайшие пути между всеми парами вершин в графе.

1. <strong>Минимальное остовное дерево</strong> <code>&#40;Minimum Spanning Tree&#44; MST&#41;</code>&#58;

    - <strong>Алгоритм Прима</strong>&#58; Построение MST, начиная с выбранной вершины и добавляя к ней ближайшие вершины с минимальными весами рёбер.

    - <strong>Алгоритм Краскала</strong>&#58; Построение MST, выбирая рёбра с наименьшим весом, которые не образуют циклов.

1. <strong>Топологическая сортировка</strong>&#58;

    - Упорядочивает вершины так, чтобы для каждого направленного ребра из вершины U в вершину V, U шло перед V.

1. <strong>Сильно связные компоненты</strong>&#58;

    - <strong>Алгоритм Косарайю</strong>&#58; Находит сильно связные компоненты в направленном графе.

    - <strong>Алгоритм Тарьяна</strong>&#58; Эффективный способ нахождения сильно связных компонент с использованием одного <code>DFS</code> обхода.

1. <strong>Сети и потоки</strong>&#58;

    - <strong>Алгоритм Форда-Фалкерсона</strong>&#58; Расчёт максимального потока из источника в сток в сети.

    - <strong>Алгоритм Эдмондса-Карпа</strong>&#58; Реализация Форда-Фалкерсона с использованием <code>BFS</code> для нахождения увеличивающих путей.

:::note[Ссылки для изучения]

1. [Базовые алгоритмы на графах на C++](https://habr.com/ru/companies/timeweb/articles/751762/)
   :::
