-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFisher_Yates_Shuffle.php
45 lines (40 loc) · 1.13 KB
/
Fisher_Yates_Shuffle.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
/**
* Fisher Yates Shuffle
* Shuffle a given array
*
* Time Complexity: O(n)
*/
function fisherYatesShuffle(&$arr) {
$n = count($arr);
if ($n === 0) {
return; // do nothing since nothing in array
} else {
$k = $n - 1; // set k to be the last index in array
while ($k) {
$r = mt_rand(0, $k);
swap($arr[$r], $arr[$k]);
$k--;
}
}
}
function swap(&$a, &$b)
{
$temp = $a;
$a = $b;
$b = $temp;
}
// ----------------
// --- Examples ---
// ----------------
define("NL", PHP_SAPI === 'cli' ? "\n" : "<br />"); // define new line feed based on web/cli
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$aString = '[' . implode(', ', $arr) . ']';
fisherYatesShuffle($arr);
$fisherYatesShuffle = '[' . implode(', ', $arr) . ']';
printf("fisherYatesShuffle(%s) = %s" . NL, $aString, $fisherYatesShuffle);
$arr = ['shuffle', 'me', 'and', 'see', 'what', 'you', 'get'];
$aString = '[' . implode(', ', $arr) . ']';
fisherYatesShuffle($arr);
$fisherYatesShuffle = '[' . implode(', ', $arr) . ']';
printf("fisherYatesShuffle(%s) = %s" . NL, $aString, $fisherYatesShuffle);