PHP中希爾排序詳解

小云云
發布: 2023-03-21 21:50:02
原創
1943 人瀏覽過

希爾排序是先將整個待排元素序列分割成若干個子序列(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本上有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本上有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

以n=10的一個陣列49, 38, 65, 97, 26, 13, 27, 49, 55, 4為例

#第一次gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55   4

1A                                        1B

        2A                                         2B

                 3A                                         3B

                         4A                                          4B

                                                 5B

1A,1B,以2A,2B等為分組標記,且數字相同的表示在同一組,大寫字母表示為該組的第幾個元素,每次同一組的資料進行直接插入排序。即分成了五組(49, 13) (38, 27) (65, 49)  (97, 55)  (26, 4)這樣每組排序後就變成了(13, 49)  (27, 38)  ( 49, 65)  (55, 97)  (4, 26),下同。

第二個gap = 5 / 2 = 2

排序後

13   27   49   55   4   49  38       1B             1C              1D 1E

        2A               2B                 2E

第三次gap = 2 / 2 = 1

4   26   13   27  1A   1B     1C    1D    1E      1F    1D  排序完成後得到陣列:

4   13   26   27   38    49   49   55   65  

範例:

<?php
/**
 * 希尔排序
 */
function shell_sort(array $arr){
    // 将$arr按升序排列
    $len = count($arr);
    $f = 3;// 定义因子
    $h = 1;// 最小为1
    while ($h < intval($len/$f)){
        $h = $f*$h + 1; // 1, 4, 13, 40, 121, 364, 1093, ...
    }
    while ($h >= 1){  // 将数组变为h有序
    	echo &#39;<br>&#39;.&#39;h:&#39;.$h.&#39;<br>&#39;.&#39;<br>&#39;;
        for ($i = $h; $i < $len; $i++){  // 将a[i]插入到a[i-h], a[i-2*h], a[i-3*h]... 之中 (算法的关键
        	echo &#39;i:&#39;.$i.&#39;<br>&#39;;
            for ($j = $i; $j >= $h && $arr[$j] < $arr[$j-$h];  $j -= $h){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j-$h];
                $arr[$j-$h] = $temp;
                dump($arr);
            }
        }
        $h = intval($h/$f);
    }
    return $arr;
}
$arr = array(14, 9, 1, 4, 6, -3, 2, 99, 13, 20, 17, 15, 3);
dump($arr);
$shell = shell_sort($arr);
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
print_r($shell);
function dump($arr)
{
	foreach ($arr as $value) {
		echo $value.&#39; &#39;;
	}
	echo &#39;<br>&#39;;
}
登入後複製

結果:

14 9 1 4 6 -3 2 99 13 20 17 15 3 
h:4
i:4
6 9 1 4 14 -3 2 99 13 20 17 15 3 
i:5
6 -3 1 4 14 9 2 99 13 20 17 15 3 
i:6
i:7
i:8##6 -3 1 4 13 9 2 99 14 20 17 15 3 
i:9
i:10
i:11
6 -3 1 4 13 9 2 15 14 20 17 99 3 
i:12
6 -3 1 4 13 9 2 15 3 20 17 99 14 
6 -3 1 4 3 9 2 15 13 20 17 99 14 
3 -3 1 4 6 9 13 20 17 99 14 
h:1
i:1
-3 3 1 4 6 9 2 15 13 20 17 99 14 
i:2
-3 1 3 4 6 9 2 15 13 20 17 99 14 
i:3
i:4
i:5
i:6
-3 1 3 4 6 2 9 15 13 20 17 99 14 
-3 1 3 4 2 6 9 15 13 20 17 99 14 
-3 1 3 2 4 6 9 15 13 20 17 99 14 
-3 1 2 3 4 69 15179 151 ##i:7
i:8
-3 1 2 3 4 6 9 13 15 20 17 99 14 
i:9
i:10
-3 1 2 3 4 6 9 13 15 17 20 99 14 
i:11
i:12
-3 1 2 3 4 6 9 13 15 17 20 14 99  
-3 1 2 3 4 6 20 14 99  
#-3 1 2 3 4 6 1713 14 20 99 
-3 1 2 3 4 6 9 13 15 14 17 20 99 
-3 1 2 3 4 6 9 13 14 15 17 20 9999

JavaScript中的希爾排序詳解

JS希爾排序與快速排序的實作方法

JavaScript排序演算法之希爾排序的2個實例_基礎知識

#

以上是PHP中希爾排序詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板