namespace Algorithms.Main.Sorting;
public class ShakerSort : SortAlgorithmBase<int>
{
public override void Sort()
{
if (Items.Count <= 1)
return;
var maxIndex = Items.Count - 1;
var left = 0;
var right = maxIndex;
while (left < right)
{
for (int i = left; i < right; i++)
{
var a = Items[i];
var b = Items[i + 1];
if (a.CompareTo(b) == 1)
{
Swap(i, i + 1);
}
}
right--;
for (int i = right; i > left; i--)
{
var a = Items[i];
var b = Items[i - 1];
if (a.CompareTo(b) == -1)
{
Swap(i, i - 1);
}
}
left++;
}
}
}
Проверил скорость сделав тест:
[Test]
public void ShakerSortTest()
{
var algorithm = new ShakerSort();
algorithm.Items = GetList();
algorithm.Sort();
Assert.That(isSorted);
}
[SetUp]
public void SetUp()
{
var random = new Random();
for (int i = 0; i < 1000; i++)
_list.Add(random.Next(0, 10000));
}
private List<int> GetList() => [.._list];
private readonly List<int> _list = [];
Использовал Stopwatch, он показывает то же время что и тесты.
Обычно время где то 120-180 мс, даже у Buble Sort от которого он пошел результат в раз 4-5 меньше.