下面先先容一下插入排序的性子:
首先,插入排序算法对付已经有序的数据进行操作的时候,效率很高,可以达到线性排序的效率。
其次,插入排序进行排序的时候,每一趟排序只能移动一个数据。以是说这样的排序方法相对来说效率又比较低。

基于此性子,希尔排序的设计者发明了希尔排序算法,其基本思想是:
先将全体待排序的记录序列分割成为多少子序列分别进行直接插入排序,分割子序列的方法便是设定一个增量,待当下的每个子序列有序的时候,将增量减一半(除以2,取整),再次进行子序列的排序。依次进行,待全体序列中的记录基本上有序的时候,再对全体记录进行依次直接插入排序,此时增量减为1,由于直接插入排序在元素基本有序的情形下(根据上述第一点,靠近最好的情形),效率是很高的。
因此,对付希尔排序,总结一句话,便是一种分组插入方法。由于设定了一个增量,并且依次将增量减1,以是希尔排序又称为递减增量排序算法。
对付希尔排序的算法步骤,可以用下图来表示
希尔排序第一趟排序
希尔排序第二趟排序
希尔排序第三趟排序
在这里须要说一下,希尔排序是稳定排序,我们可以设定一组数据按照上述办法进行排序,可以创造其为稳定排序。
希尔排序在按照增量分组往后,其组内的排序可以利用插入排序,当然也可以利用冒泡排序、选择排序等等
下面奉上希尔排序的PHP实当代码
$arr = array(10,6,20,50,30,7,23,35,40,1,17);/ 首先初始化 增量 数组长度/2 取整 floor() 函数向下取整 对付增量每次循环都由 当前增量/2 /for($dl=floor(count($arr)/2);$dl>=1;$dl=floor($dl/2)){ / 每次从 增量的位置开始,直到数组递增变量达到数组的长度 / for($j=$dl;$j<count($arr);$j++){ for($i=$j-$dl;$i>=0;$i-=$dl){ if($arr[$i+$dl]<$arr[$i]){ $temp = $arr[$i+$dl]; $arr[$i+$dl]=$arr[$i]; $arr[$i]=$temp; } } }}
以上代码只是个中的一种实现办法,其代码实现有很多种,仅仅针对组内的排序办法就有很多,如果大家有什么好的方法,欢迎从下面留言,大家共同谈论,共同提高。