Heim > Backend-Entwicklung > PHP-Tutorial > php实现基数排序,该怎么解决

php实现基数排序,该怎么解决

WBOY
Freigeben: 2016-06-13 11:53:35
Original
948 Leute haben es durchsucht

php实现基数排序
刚开始学算法,碰上基数排序,就用php试试实现一下,但是有地方自己搞不懂
红色字体的地方,为什么要有这个才能正确运算呢
希望有人能帮我看看这样写对不对,或者有谁能贴一个漂亮点的写法(php)来给我参考一下,
感激不尽
/*
*计数排序
*$a是存储某数位的数组
*$arr是待排序数组
*/
function countsort($a,$arr){
$b = array();
foreach($a as $value){
$b[$value]++;
}
for($i = 1; $i  $b[$i] = $b[$i] + $b[$i-1];
}
$c = array();
for($i = count($a)- 1; $i >= 0; $i--){
$c[$b[$a[$i]]]  = $arr[$i];
$b[$a[$i]] = $b[$a[$i]] - 1;
}
return $c;
}

/*
*获取数组中各数某一数位数值,并返回该数组
*$num,用来获取数位的数组
*$tail获取哪个数位
*/
function gettail($num, $tail){
for($i = 0; $i  if($num[$i]  if($num[$i] >= pow(10,$tail-1)){
$temp[$i]=floor($num[$i]/pow(10,$tail-1));
}else{
$temp[$i] = floor(0);
}
}else{
$temp[$i] = floor($num[$i]%pow(10,$tail) / pow(10,$tail-1));
$flag = true;
}
}
return $temp;
}

/*
*基数排序
*/
function basesort($arr){
//4代表待排序数组中最大数的数位
for($i = 1; $i $temp = gettail($arr,$i);
$arr = countsort($temp,$arr);
for($j = 1; $j  $new[$j-1] = $arr[$j];
}
$arr = $new;

}
return $arr;
}
$arr = array(11,342,543,213,98,312,0,234,322,455,164,88,100,999,1000);
print_r(basesort($arr));
?>
------解决方案--------------------

本帖最后由 xuzuning 于 2014-03-02 11:56:47 编辑 一下也看不清你的思路,根据基数排序的原理可写作
$a = array(11,342,543,213,98,312,0,234,322,455,164,88,100,999,1000);<br />$t = radix_sort($a);<br />echo join(',', $t);<br /><br />function radix_sort($ar, $p=1) {<br />  $m = 0;<br />  foreach($ar as $v) {<br />    $m = max($m, strlen($v));<br />    $k = strlen($v) >= $p ? substr($v, -$p, 1) : 0;<br />    $t[$k][] = $v;<br />  }<br />  $res = array();<br />  for($i=0; $i<10; $i++) {<br />    if(isset($t[$i])) foreach($t[$i] as $v) $res[] = $v;<br />  }<br />  return $m > $p ? radix_sort($res, $p+1) : $res;<br />}
Nach dem Login kopieren
0,11,88,98,100,164,213,234,312,322,342,455,543,999,1000
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage