希尔排序算法

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

php代码实现:

<?php
class shell_sort
{
    function __construct(&$arr)
    {
        if(!is_array($arr))
            return FALSE;
        $n = count($arr);
        for($gap=floor($n/2); $gap>0; $gap=floor($gap/=2))
        {
            for($i=$gap; $i<$n; $i++)
            {
                for($j=$i-$gap; $j>=0&&$arr[$j+$gap]<$arr[$j]; $j-=$gap)
                {
                    $temp = $arr[$j];
                    $arr[$j] = $arr[$j+$gap];
                    $arr[$j+$gap] = $temp;
                }
            }
        }
        $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 = '49, 38, 65, 97, 76, 13, 27, 49, 55, 04';
    $arr = explode(', ', $str);
    new shell_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 shell_sort($arr);
    }
}

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


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