diff --git a/task6.cpp b/task6.cpp new file mode 100644 index 0000000..fd1dc32 --- /dev/null +++ b/task6.cpp @@ -0,0 +1,58 @@ +#include +#include + +int partition(std::vector &vec, int low, int high) +{ + // Функция отрезка для подготовки массива + // и выбора опорного элемента + + // Выбираем последний элемент в качестве опорного + int key = vec[high]; + + // Индекс предпоследнего элемента + int i = (low - 1); + + for (int j = low; j <= high - 1; j++) + { + // Если значение элемента j меньше либо равно значению опорного, + // то меняем местами + if (vec[j] <= key) + { + i++; + std::swap(vec[i], vec[j]); + } + } + + // Устанавливаем опорный элемент в позицию полученного i + std::swap(vec[i + 1], vec[high]); + + // Возвращаем индекс отрезка + return (i + 1); +} + +void quickSort(std::vector &vec, int low, int high) +{ + if (low < high) + { + // При помощи функции отрезка выбираем опорный элемент. + int pi = partition(vec, low, high); + + // Применяем быструю сортировку к левому и правому отрезку + quickSort(vec, low, pi - 1); + quickSort(vec, pi + 1, high); + } +} + +int main() +{ + std::vector vec = {12, 11, 13, 5, 6}; + quickSort(vec, 0, vec.size() - 1); + + for (int i : vec) + { + std::cout << i << " "; + } + std::cout << std::endl; + + return 0; +}