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基数排序算法 - 类型转换好吗?的主要内容,如果未能解决你的问题,请参考以下文章

排序算法:Radix Sort 基数排序

算法 - 基数排序

算法基数排序

基于桶的基数排序

数据结构与算法——计数排序桶排序基数排序

基数排序算法的Java实现