2015-07-21 2 views
3

Я тестирую код, который я написал, чтобы перетасовать элементы массива. Хотя это не настоящий «профессиональный тест», мне было интересно узнать о результатах.
Я создал случайный массив и продолжал перетасовывать его до тех пор, пока массив не будет отсортирован. Я ожидал, что количество раз, чтобы получить отсортированный порядок, будет вокруг n!/2, и максимальные перетасовки должны быть вокруг n !, где n - количество элементов в массиве.Тест на перетасование кода

С 5 элементами количество перетасовки в среднем составляет около 108 и от 6 до 615. Я был удивлен, увидев, что некоторые перетасовки заняли более 500 раз, даже если у меня было всего 5 элементов.

Мой вопрос в том, что есть объяснение для этого результата и/или мои аргументы в пользу правильного правильного тасования? Мой код в случайном порядке

void shuffle(int* array, int length) 
{ 
    int i=0; 
    int r =0; 
    for(i=0;i<length;i++) 
    { 
     r = randomInRange(0,i); 
     swap(array,i,r); 
    } 
} 
+2

Это (в) известный [bogosort] (https://en.wikipedia.org/wiki/Bogosort). – pmg

+2

Сортированный заказ один в n! возможные заказы. Если тасовка производит каждый порядок с равной вероятностью 1/n! количество сортировок, необходимых для сортировки, имеет [геометрическое распределение] (https://en.wikipedia.org/wiki/Geometric_distribution) с ожидаемым значением n !. – Joni

+3

Худший случай неограничен. Также возможно, что производительность зависит от распределения случайных чисел. – Daniele

ответ

3

Почему n!/2? Число перестановок равно n !, поэтому после n! перетасовки, вы только ожидали, что цифры будут правильно упорядочены один раз. Максимальное количество перетасовки - с 5 картами, у вас есть шанс 119/120 получить неуправляемый результат на каждой итерации, и это может продолжаться очень долго.

Вот вывод скрипта Python, я написал, чтобы подсчитать количество раз потребовалось, чтобы правильно угадать случайное число от 1 до 120:

[17, 43, 251, 72, 4, 10, 41, 61, 74, 22, 172, 49, 43, 66, 994, 99, 59, 88, 255, 48] 

Среднее значение 123,4, что в значительной степени, как ожидаемый, но даже в этом небольшом наборе образцов отдельные значения варьируются от 4 до 994.

Однако в вашем случае результаты немного отличаются. Это связано с тем, что вы используете алгоритм перетасовки, который дает искаженные результаты. (Jeff Atwood has written a useful blog post on the subject.)

Я предлагаю вместо этого использовать Fisher-Yates algorithm.

+0

Моя ошибка заключалась в предположении, что массив будет отсортирован в n! пытается. Если бы это было так, n!/2 было бы допустимым предположением. Предполагаемый код перетасовки должен быть алгоритмом knuth-fisher-yates – jogabonito

+0

@jogabonito Извините, моя ошибка. Ваша функция перетасовки в порядке. Вы можете запустить итерацию 'i' из 1, хотя, так как с каждым раз не происходит большого количества переменных' array [0] '. –