1 <?php 2 #隨機播放第i小的數字,用隨機快排實現 3 4 #交換元素 5 function swap(&$arr, $i, $j) { 6 $temp = $arr[$i]; 7 $arr[$i] = $arr[$j]; 8 $arr[$j] = $temp; 9 }10 11 #隨機劃分12 function randomized_partition(&$arr, $begin, $end) {13 $rand_inx = rand($begin, $end);14 swap($arr, $begin, $rand_inx);15 return partition($arr, $begin, $end);16 }17 18 #劃分19 function partition(&$arr, $begin, $end) {20 #以第一個元素作為中樞元素21 $pivot = $begin;22 $low = $begin;23 $high = $end;24 25 while ($low < $high) {26 while ($low < $high && $arr[$low] <= $arr[$pivot]) {27 $low++;28 }29 30 while ($low < $high && $arr[$high] >= $arr[$pivot]) {31 $high--;32 }33 34 swap($arr, $low, $high);35 }36 37 #交換中樞元素38 if ($arr[$pivot] < $arr[$low]) {39 $low--;40 }41 swap($arr, $pivot, $low);42 return $low;43 }44 45 #快速排序,此處沒用到46 function quick_sort(&$arr, $begin, $end) {47 $q = randomized_partition($arr, $begin, $end);48 if ($q > $begin) {49 quick_sort($arr, $begin, $q - 1);50 }51 if ($q < $end) {52 quick_sort($arr, $q + 1, $end);53 }54 }55 56 #選取第i小的數57 function randomized_select(&$arr, $begin, $end, $i) {58 if ($begin == $end) {59 return $arr[$begin];60 }61 62 $q = randomized_partition($arr, $begin, $end);63 $k = $q - $begin + 1; #k代表小於等於q的元素個數64 65 if ($k == $i) { #如果k=i,說明q就是第i小的元素座標66 return $arr[$q];67 } else if ($i < $k) { #如果i<k,說明第i小的元素位於q的左邊68 return randomized_select($arr, $begin, $q - 1, $i);69 } else { #第i小的元素位於q的右邊,此時尋找右邊的第i-k小的元素70 return randomized_select($arr, $q + 1, $end, $i - $k);71 }72 }73 74 $arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11);75 $t = randomized_select($arr, 0, count($arr) - 1, 8);76 print_r("The 8th minimum element: {$t}");77 echo "<br>";78 quick_sort($arr, 0, count($arr) - 1);79 print_r($arr);80 ?>
The 8th minimum element: 7
Array ( [0] => 0 [1] => 0 [2] => 1 [3] => 2 [4] => 3 [5] => 4 [6] => 5 [7] => 7 [8] => 8 [9] => 9 [10] => 11 )