Quick Sort отличается быстротой выполнения и эффективностью использования памяти. Это один из самых популярных алгоритмов в мире программирования.
Основная идея базируется на парадигме «разделяй и властвуй». Алгоритм сначала выбирает опорный элемент (pivot). Затем делит массив на два подмассива: в первом элементы меньше или равны pivot, а во втором — больше. После этого каждый подмассив сортируется независимо. Затем процесс рекурсивно повторяется для обоих подмассивов, что позволяет эффективно упорядочить элементы.
Quick Sort показывает одну из лучших производительностей среди алгоритмов сортировки:
Quick Sort подходит для множества задач — от упорядочивания массивов в простых приложениях до сложных системных решений, где нужно обеспечить эффективную сортировку на месте. Этот алгоритм часто используется в качестве встроенного метода сортировки в популярных библиотеках, например, в C++ и Python.
Чтобы улучшить производительность Quick Sort, можно использовать несколько оптимизаций:
#include <iostream> #include <vector> #include <algorithm> // для std::copy, std::back_inserter // Рекурсивная реализация quick sort, возвращающая новый вектор: // - принимает const ссылку на входной вектор, чтобы не копировать сразу // - возвращает отсортированный вектор std::vector<int> quick_sort(const std::vector<int>& arr) { if (arr.size() <= 1) return arr; // базовый случай: пустой или единичный вектор уже отсортирован // Выбор опорного элемента — средний элемент вектора int pivot = arr[arr.size() / 2]; // Разделяем элементы на три группы: // left - элементы < pivot // middle - элементы == pivot (чтобы корректно обрабатывать дубликаты) // right - элементы > pivot std::vector<int> left, middle, right; left.reserve(arr.size()); // резервируем память заранее, чтобы уменьшить число выделений middle.reserve(arr.size()); right.reserve(arr.size()); for (int x : arr) { if (x < pivot) left.push_back(x); else if (x == pivot) middle.push_back(x); else right.push_back(x); } // Рекурсивно сортируем левую и правую подпоследовательности std::vector<int> sorted_left = quick_sort(left); std::vector<int> sorted_right = quick_sort(right); // Объединяем результаты: отсортленная левая часть + середина + отсортированная правая часть std::vector<int> result; result.reserve(sorted_left.size() + middle.size() + sorted_right.size()); // резервируем итоговый размер // Копируем элементы в итоговый вектор std::copy(sorted_left.begin(), sorted_left.end(), std::back_inserter(result)); std::copy(middle.begin(), middle.end(), std::back_inserter(result)); std::copy(sorted_right.begin(), sorted_right.end(), std::back_inserter(result)); return result; } int main() { // Пример использования: исходный массив std::vector<int> array = {10, 7, 8, 9, 1, 5}; // Получаем отсортированный массив (функция возвращает новый вектор) std::vector<int> sorted_array = quick_sort(array); // Вывод результата в консоль std::cout << "Отсортированный массив: "; for (size_t i = 0; i < sorted_array.size(); ++i) { if (i) std::cout << ", "; // выводим запятую перед элементом, начиная со второго std::cout << sorted_array[i]; } std::cout << std::endl; return 0; }