Используя генетический алгоритм, я нашел этот список сравнения:
compareAndSwap(x[0],x[2]);
compareAndSwap(x[3],x[4]);
compareAndSwap(x[2],x[4]);
compareAndSwap(x[0],x[3]);
compareAndSwap(x[2],x[3]);
compareAndSwap(x[1],x[3]);
compareAndSwap(x[1],x[2]);
compareAndSwap(x[0],x[1]);
compareAndSwap(x[3],x[4]);
, но мне нужно проверить его, работает ли он во всех случаях.Также количество элементов массива (в настоящее время 5) может возрасти до 100 в некоторых ситуациях.Это означало бы, что число проверяемых случаев быстро растет, например, более чем pow(2,100)
.
Если я приведу только отсортированный массив в худшем случае, это не проверяет наличие ошибок относительно среднего элементаx[2]
сравнений.Например, 5,4,3,2,1 сортируется некоторой функцией в 1,2,3,4,5, только по
compareAndSwap(x[0],x[4]);
compareAndSwap(x[1],x[3]);
, и это, конечно, не сортирует много случаев 5-элементные массивы.
Пробовал генераторы случайных чисел для выборочных массивов, но не уверен, что это приемлемо:
std::random_device rd;
std::mt19937 rng(rd());
std::uniform_real_distribution<double> dist(0,1);
for(int k=0;k<500;k++)
{
std::vector<double> arraySorted;
for(int i=0;i<5;i++)
arraySorted.push_back(dist(rng));
//sortNetwork(arraySorted.data());
//if(!std::is_sorted(arraySorted.begin(),arraySorted.end()))
throw std::runtime_error("error");
}
, даже при этом могут пропустить некоторые части.Существует ли быстрый способ проверки алгоритмов сортировки?
Что если бы это был массив из 1000 элементов?Проверяются ли они с использованием математики, ручки и бумаги в рамках некоторых теорем и известных алгоритмов или с использованием суперкомпьютеров?
Только несколько примеров для 4 элементов:
1 2 3 4
1 2 4 3
2 1 3 4
2 1 4 3
1 2 0 1
1 2 1 0
2 1 0 1
2 1 1 0
3 4 2 1
3 4 1 2
4 3 2 1
4 3 1 2
1 1 1 1
, кажется, имеет больше, чем pow (2, n) падежи.
Можно ли как-то трактовать сеть сортировки как проблему с графом при генерации тестовых данных?