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

大家那種好理解用那種就可以,如果有更好的思路和代碼歡迎大家進行留言!

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