PHP基数排序算法 - 类型转换好吗?
Posted
技术标签:
【中文标题】PHP基数排序算法 - 类型转换好吗?【英文标题】:PHP Radix Sort Algorithm - Type conversion ok? 【发布时间】:2015-08-11 23:31:51 【问题描述】:这是我在 php 中为基数排序编写的函数。 它适用于数组填充数字大于 0 的所有情况。
function radix_sort($arr)
// Find the number of passes needed to complete the sort
$passes = strlen((string)max($arr));
$buckets = [];
// Start the passes
for($i = 1; $i <= $passes; $i++)
// Create - reinitialize some buckets
for ($b = 0; $b <= 9; $b++)
$buckets[$b] = [];
for ($j = 0; $j < count($arr); $j++)
// Drop into the proper bucket based on the significant digit
$numStr = (string)$arr[$j];
if (strlen($numStr) < $i)
$bucketsIndex = 0;
else
$bucketsIndex = $numStr[strlen($numStr) - $i];
array_push($buckets[$bucketsIndex], $arr[$j]);
// Repopulate our array by pulling out of our buckets
$k = 0;
foreach ($buckets as $bucket)
foreach ($bucket as $value)
$arr[$k] = $value;
$k++;
return $arr;
我觉得有太多的类型转换正在进行。这样做可以吗?如果我想从一个大数中提取第 N 位,PHP 中是否有更好的方法?
【问题讨论】:
【参考方案1】:您可以在函数之前将所有值转换为string
,然后在最后恢复为int
:
function radix_sort($arr)
$arr = array_map ('strval', $arr) ;
$passes = strlen(max($arr)) ; // Should still work since all values are numeric
/* Do your stuff... */
return array_map ('intval', $arr) ;
然后在您的内部循环中,您可以存储长度(我真的不知道 PHP 中 strlen
的复杂性,但我认为它不是 O(1)
):
for ($j = 0; $j < count($arr); $j++)
// Drop into the proper bucket based on the significant digit
$numStr = $arr[$j];
$numLen = strlen($numStr) ;
if ($numLen < $i)
$bucketsIndex = 0;
else
$bucketsIndex = $numStr[$numLen - $i];
array_push($buckets[$bucketsIndex], $arr[$j]);
或者你甚至可以(如果你有足够的内存)使用一个数组来预先计算长度:
$lengths = array_map ('strlen', $arr) ;
【讨论】:
以上是关于PHP基数排序算法 - 类型转换好吗?的主要内容,如果未能解决你的问题,请参考以下文章