using System;
namespace SortingApp
{
/// <summary>
/// Класс для демонстрации работы алгоритма шейкерной сортировки.
/// </summary>
class Program
{
/// <summary>
/// Точка входа в программу. Отвечает за взаимодействие с пользователем (I/O).
/// </summary>
static void Main(string[] args)
{
int[] numbers = { 5, 1, 4, 2, 8, 0, 2 };
Console.WriteLine($"Исходный массив: {string.Join(", ", numbers)}");
PerformShakerSort(numbers);
Console.WriteLine($"Отсортированный массив: {string.Join(", ", numbers)}");
}
/// <summary>
/// Выполняет сортировку массива целых чисел методом шейкерной сортировки.
/// </summary>
/// <param name="array">Массив для сортировки.</param>
private static void PerformShakerSort(int[] array)
{
int leftIndex = 0;
int rightIndex = array.Length - 1;
while (leftIndex < rightIndex)
{
bool isSwapped = false;
// Проход слева направо
for (int i = leftIndex; i < rightIndex; i++)
{
if (array[i] > array[i + 1])
{
SwapElements(ref array[i], ref array[i + 1]);
isSwapped = true;
}
}
rightIndex--;
// Если обменов не было, массив отсортирован
if (!isSwapped)
{
break;
}
isSwapped = false;
// Проход справа налево
for (int i = rightIndex; i > leftIndex; i--)
{
if (array[i] < array[i - 1])
{
SwapElements(ref array[i], ref array[i - 1]);
isSwapped = true;
}
}
leftIndex++;
if (!isSwapped)
{
break;
}
}
}
/// <summary>
/// Вспомогательный метод для обмена значениями двух элементов.
/// </summary>
private static void SwapElements(ref int firstValue, ref int secondValue)
{
int tempValue = firstValue;
firstValue = secondValue;
secondValue = tempValue;
}
}
}