基数排序算法

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
实现方法:
最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。
最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

php代码实现如下:

<?php
class radix_sort
{
    function __construct(&$arr)
    {
        if(!is_array($arr))
            return FALSE;
        $length = count($arr);
        $d = 1;
        foreach($arr as $v)
        {
            $d_len = strlen($v);
            if($d_len > $d)
            {
                $d = $d_len;    
            }
        }
        $k = 0;
        $n = 1;
        $m = 1; //控制键值排序依据在哪一位
        $temp = array(); //数组的第一维表示可能的余数0-9
        $order = array_fill(0, 10, 0); //数组orderp[i]用来表示该位是i的数的个数
        while($m <= $d)
        {
            for($i=0; $i<$length; $i++)
            {
                $lsd = (($arr[$i] / $n) % 10);
                $temp[$lsd][$order[$lsd]] = $arr[$i];
                $order[$lsd]++;
            }
            for($i=0; $i<10; $i++)
            {
                if($order[$i] != 0)
                for($j=0; $j<$order[$i]; $j++)
                {
                    $arr[$k] = $temp[$i][$j];
                    $k++;
                }
                $order[$i] = 0;
            }
            $n *= 10;
            $k = 0;
            $m++;
        }
        $this->output($arr);
    }
    
    private function output($arr)
    {
        echo iconv('utf-8', 'gbk', "整数序列经基数排序后的结果如下:\n");
        $str = '';
        foreach($arr as $number)
        {
            $str .= $number.', ';
        }    
        echo rtrim($str, ', ')."\n\n";
    }
}

function read()
{
    $input = trim(fgets(STDIN));
    return $input;
}

function test()
{
    $str = '73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100';
    $arr = explode(', ', $str);
    new radix_sort($arr);
}

function main()
{
    $flag = TRUE;
    while($flag)
    {
        echo iconv('utf-8', 'gbk', "请输入整数序列,以英文半角逗号和空格分隔,例如49, 38, 65(退出请输入exit或quit)\n");
        $str = read();
        if($str == 'exit' || $str == 'quit')
        {
            echo 'Bye';
            break;    
        }
        $arr = explode(', ', $str);
        $validity = TRUE;
        foreach($arr as $number)
        {
            if(!is_numeric($number))
            {
                echo iconv('utf-8', 'gbk', "数字序列输入有误,请重新输入\n");
                $validity = FALSE;
                break;
            }
        }
        if(!$validity)
        {
            continue;    
        }
        new radix_sort($arr);
    }
}

if(!empty($argv[1]) && $argv[1]=='test')
{
    test();    
}
else
{
    main();
}


你可能感兴趣的:(PHP,算法)