Проблема с наивным перемешиванием состоит в том, что значение, возможно, уже было изменено, и вы можете заменить его позже.Допустим, у вас есть три карты, и вы выбираете одну действительно случайную для первой карты.Если позже вы сможете случайным образом поменять эту карту на другую, тогда вы заберете случайность первого выбора.
Если сортировка выполняется быстро, она непрерывно разделяет список пополам.Следующая итерация разбивает каждую из этих групп на две группы случайным образом.Это продолжается до тех пор, пока вы не перейдете к отдельным картам, а затем объедините их все вместе.Разница в том, что вы никогда не берете карту из второй случайно выбранной группы и перемещаете ее обратно в первую группу.
Перемешивание Кнута-Фишера-Йейтса отличается от случайного перемешивания, поскольку вы выбираете карту только один раз,Если бы вы выбирали случайные карты из колоды, вы бы положили карту обратно и забрали снова?Нет, вы берете случайные карты по одной за раз.Это первое, что я слышал об этом, но я делал нечто подобное еще в старшей школе, начиная с индекса 0 и выше.KFY, вероятно, быстрее, потому что у меня есть дополнительное дополнение в случайном выражении.
for (int i = 0; i < cards.Length - 1; i++)
{
int n = rand.Next(cards.Length - i) + i; // (i to cards.Length - 1)
Swap(ref cards[i], ref cards[n]);
}
Не думайте об этом как об обмене, думайте об этом как о выборе случайных карт из колоды.Для каждого элемента в массиве (кроме последнего, потому что остался только один) вы выбираете случайную карту из всех оставшихся карт и кладете ее, образуя новую стопку карт, которые перемешиваются случайным образом.Неважно, что ваши оставшиеся карты больше не находятся в исходном порядке, если вы уже сделали какой-либо обмен, вы все равно выбираете одну случайную карту из всех оставшихся карт.
Случайная быстрая сортировка похожа настопку карт и случайным образом разделив их на две группы, затем взяв каждую группу и случайным образом разделив ее на две меньшие группы, и так далее, пока у вас не появятся отдельные карты, а затем соедините их вместе.