希尔排序按其设计者希尔(Donald Shell)的名字命名,它是一种基于插入排序的快速排序算法,要了解希尔排序,必须先掌握插入排序的原理与实现。
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。
算法示意图:
/** * 希尔排序 * 实质上是一种分组插入方法。 * 它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中; * 然后,对各组内的元素进行直接插入排序。 这一趟排序完成之后,每一个组的元素都是有序的。 * 然后减小gap的值,并重复执行上述的分组和排序。 * * 重复这样的操作,当gap=1时,整个数列就是有序的。 * @param unknown $arr * @return unknown */ function shell_sort($arr){ $count = count($arr); $increment = $count; // 增量数值 while ($increment>1) { $increment = floor($increment / 3 + 1); // 根据公式生成增量(有多种公式可选择) for($i=1;$i<$count;$i++){ $insert_value = $arr[$i]; $j = $i-$increment; while ($j>=0 && $arr[$j]>$insert_value) { $arr[$j+$increment] = $arr[$j]; $j-=$increment; } $arr[$j+$increment] = $insert_value; } } return $arr; }
参考:
https://blog.csdn.net/daiyudong2020/article/details/52445044
http://www.cnblogs.com/huangxincheng/archive/2011/11/20/2255695.html
https://www.cnblogs.com/jsgnadsj/p/3458054.html