希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

php代码实现:

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();}