您的位置:首页 > 其它

希尔算法

2017-08-30 21:02 62 查看

/**

 * 希尔排序

 */

function shell_sort($arr){

    // 将$arr按升序排列

    $len = count($arr);//算数组的总长度

    $f = 3;// 定义因子//拿这个数和哪个数比

    $h = 1;// 最小为1//最小隔几个对比,设为1就是隔一个对比

    if($h < $len/$f){//定义和第几个比

        $h = $f*$h + 1; // 1, 4, 13, 40, 121, 364, 1093, ...不能从下标0开始

    }

    while ($h >= 1){  // 将数组变为h有序  while循环条件为TURE时执行;

        for ($i = $h; $i < $len; $i++){  // 将a[i]插入到a[i-h], a[i-2*h], a[i-3*h]... 之中 (算法的关键,循环判断

//           echo $i."<br>";

            for ($j = $i; $j >= $h;  $j -= $h){//判断条件是否成立

                if ($arr[$j] < $arr[$j-$h]){//拿第一个数和第(4)个数相比,如果第一个数大于第四个数就调换位置,从而做到排序

                    $temp = $arr[$j];

                    $arr[$j] = $arr[$j-$h];

                    $arr[$j-$h] = $temp;

                }

//                echo $j-$h."--".$j;

//                print_r($arr);echo '<br/>'; // 打开这行注释,可以看到每一步被替换的情形

            }

        }

        $h = intval($h/$f);//条件

    }

    return $arr;

}

$arr = array(14, 9, 1, 4, 6, 15, 3);
print_r(shell_sort($arr));die;

以上归结于网上总结,方便日后查看,大神勿喷。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  希尔算法