diff --git a/task2.cpp b/task2.cpp new file mode 100644 index 0000000..8743e01 --- /dev/null +++ b/task2.cpp @@ -0,0 +1,71 @@ +#include + +void CocktailSort(int a[], int n) +{ + // Сортировка перемешиванием + + bool swapped = true; // Индикатор того, было ли перемещение на пред. шаге + int start = 0; // Левая граница, изначально в начале + int end = n - 1; // Правая граница, изначально в конце + + // Пробуем двигать элемент слева направо + while (swapped) + { + // Помечаем, что перестановок еще не произошло + swapped = false; + + // Цикл от левой границы до правой + for (int i = start; i < end; i++) + { + // Если элемент справа больше, чем слева, + // то меняем их местами. Отмечаем, что перестановка произошла + if (a[i] > a[i + 1]) + { + std::swap(a[i], a[i + 1]); + swapped = true; + } + } + + // Если перестановок не было, значит массив уже отсортирован. + if (!swapped) + { + break; + } + + // Иначе готовимся к следующему этапу сортировки и + // снова считаем, что перестановок пока еще не было + swapped = false; + + // Сужаем правую границу на 1. В прошлом цикле мы + // определили, что на этом индексе элемент уже находится + // на правильном месте. + end--; + + // Пробуем двигать элемент справа налево + for (int i = end - 1; i >= start; i--) + { + if (a[i] > a[i + 1]) + { + std::swap(a[i], a[i + 1]); + swapped = true; + } + } + + // Сужаем левую границу на 1. + start++; + } +} + +int main() +{ + int arr[] = {12, 11, 13, 5, 6}; + int n = sizeof(arr) / sizeof(arr[0]); + + CocktailSort(arr, n); + + for (int i = 0; i < n; i++) + { + std::cout << arr[i] << " "; + } + std::cout << std::endl; +}