PHP实现希尔排序

来源:互联网 发布:计算机软件编程入门 编辑:程序博客网 时间:2024/06/04 00:46

希尔排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,实际上是将相隔某个“增量”的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高,以减少数据交换和移动的次数。平均效率是O(nlogn),空间复杂度O(1)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。

 

希尔排序比冒泡排序快5倍,比插入排序大致快2倍。希尔排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。最坏的情况下时间复杂度是 O(n^2)。

function swap(array &$arr, $a, $b){    $temp = $arr[$a];    $arr[$a] = $arr[$b];    $arr[$b] = $temp;}//希尔排序function shell_sort(array &$arr){    // 将$arr按升序排列    $len = count($arr);    $f = 3; // 定义因子    $inc = 1; // 最小增量为1    while ($inc < $len/$f){        $inc = $inc * $f + 1; // 1, 4, 13, 40, 121, ...           }    while ($inc >= 1){          for ($i = $inc; $i < $len; $i++){          // 将a[i]插入到a[i-h], a[i-2*h], a[i-3*h]... 之中            for ($j = $i; $j >= $inc;  $j -= $inc){                if ($arr[$j] < $arr[$j-$inc]){                    swap($arr, $j, $j-$inc);                }                            }        }        $inc = intval($inc/$f);            }    }$arr = array(49,8,65,6,76,13,27,15,-5,3);shell_sort($arr);print_r($arr);