PHP 排序算法(五) 希尔排序

希尔排序

希尔排序又称缩小增量排序,是指将无序序列,按照增量的不同大小,分成若干个序列,然后对子序列进行插入排序,本质上就是插入排序。

思路:  

  1.  我们先确定增量,一般初始增量我们都设置为数组长度的一半(向下取整);
  2.  我们根据增量,将数组分成了若干个子序列:

  3.  分别对这四个子序列进行插入排序: 

  4.  然后再一次遍历,增量设置为原先的一半,也就是继续除以2(向下取整),得出的序列: 

  5.  分别对这两个序列进行插入排序,结果为:

  6.  再将增量除以2得到新增量为1,便可以立即进行插入排序:

  7.  得到的结果就是有序数组,就在也无需进行排序了:1,2,3,4,5,6,7,9,10

下面的代码是我按照思路,一步一步写出来的,应该较好理解:

function shellSort($arr){
    $length = count($arr);
    //增量初始化;
    $plus = floor($length/2);
    while($plus>0){
        for($i = 1;$i <= $plus;$i++){  //有几个子序列
            for($j = $plus;$j<$length/$plus;$j+=$plus){
                $tmp = $arr[$j];
                for($k = $j-$plus;$k>=0;$k-=$plus){
                    if($tmp < $arr[$k]){
                        $arr[$k+$plus] = $arr[$k];
                        $arr[$k] = $tmp;
                    }
                }
            }
        }
        $plus = floor($plus/2);
    }
    return $arr;
}

$arr = array(6,2,4,3,5,7,9,1,10);
print_r(shellSort($arr));

这下面是根据网上大神的代码,然后对自己的代码进行优化后的,进一步思考后也应该可以理解:

function shellSort($arr) {
    $length = count($arr);
    //增量初始化;
    $plus = $length;
    while ($plus > 0) {
        for ($i = $plus; $i < $length; $i++) {
            $tmp = $arr[$i];
            for ($j = $i - $plus; $j >= 0; $j -= $plus) {
                if ($tmp < $arr[$j]) {
                    $arr[$j + $plus] = $arr[$j];
                    $arr[$j] = $tmp;
                }
            }
        }
        $plus = floor($plus / 2);
    }
    return $arr;
}
$arr = array(6,2,4,3,5,7,9,1,10);
print_r(shellSort($arr));

大家那种好理解用那种就可以,如果有更好的思路和代码欢迎大家进行留言!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章