<?php #随机选择第i小的数字,用随机快排实现 #交换元素 function swap(&$arr, $i, $j) { $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } #随机划分 function randomized_partition(&$arr, $begin, $end) { $rand_inx = rand($begin, $end); swap($arr, $begin, $rand_inx); return partition($arr, $begin, $end); } #划分 function partition(&$arr, $begin, $end) { #以第一个元素作为中枢元素 $pivot = $begin; $low = $begin; $high = $end; while ($low < $high) { while ($low < $high && $arr[$low] <= $arr[$pivot]) { $low++; } while ($low < $high && $arr[$high] >= $arr[$pivot]) { $high--; } swap($arr, $low, $high); } #交换中枢元素 if ($arr[$pivot] < $arr[$low]) { $low--; } swap($arr, $pivot, $low); return $low; } #快速排序,此处没用到 function quick_sort(&$arr, $begin, $end) { $q = randomized_partition($arr, $begin, $end); if ($q > $begin) { quick_sort($arr, $begin, $q - 1); } if ($q < $end) { quick_sort($arr, $q + 1, $end); } } #选取第i小的数 function randomized_select(&$arr, $begin, $end, $i) { if ($begin == $end) { return $arr[$begin]; } $q = randomized_partition($arr, $begin, $end); $k = $q - $begin + 1; #k代表小于等于q的元素个数 if ($k == $i) { #如果k=i,说明q就是第i小的元素坐标 return $arr[$q]; } else if ($i < $k) { #如果i<k,说明第i小的元素位于q的左边 return randomized_select($arr, $begin, $q - 1, $i); } else { #第i小的元素位于q的右边,此时查找右边的第i-k小的元素 return randomized_select($arr, $q + 1, $end, $i - $k); } } $arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11); $t = randomized_select($arr, 0, count($arr) - 1, 8); print_r("The 8th minimum element: {$t}"); echo "<br>"; quick_sort($arr, 0, count($arr) - 1); print_r($arr); ?> |