快速递归找到第k大值

/**
 * 快速找到第k大的数
 */
function fastGetK($arr, $k) {
 $key = array_rand ( $arr );
 $val0 = $arr [$key];
 unset ($arr [$key]);
 $left = array ();
 $right = array ();
 foreach ( $arr as $keyv => $val ) {
  //if($keyv==$key) continue;
  if ($val0 < $val) {
   $right [] = $val;
  } else {
   $left [] = $val;
  }
 }
 $lenr = count ( $right );
 $lenl = count ( $left );
 if ($lenr > $k - 1) {
  return fastGetK ( $right, $k );
 } elseif ($lenr == $k - 1) {
  return $val0;
 } else {
  return fastGetK ( $left, $k - $lenr - 1 );
 }
}

posted @ 2011-08-16 17:27  安子  阅读(154)  评论(0编辑  收藏  举报