希尔排序

来源:互联网 发布:回转交易 知乎 编辑:程序博客网 时间:2024/05/24 04:44

原理

先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(increment)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,当增量减少至 1 时,整个序列恰好被分成一组,算法便终止。

实现

比如:
数组有10个元素,增量 d = 5;则比较元素为:array[0] array[0+d] array[0+2d] array[0+3d];(当然 d 会改变的,d = d/2 或者 d = d -2)
第一次 d = 5 比较的元素为:array[0] , array[5]
第二次 d = d/2 = 2 比较元素为:array[0] , array[2] , array[4] , array[6] , array[8]
第三次 d = d/2 = 1 比较元素为:从array[0] 到 array[9]

其实上面的插入排序可以看作是 增量 d = 1的shell排序;当然同理,shell排序 最后增量 d = 1时, 就是插入排序了;

function ShellSort(array &$arr){    $count = count($arr);    $inc = $count;    //增量    do {        //计算增量        $inc = ceil($inc / 2);        for ($i = $inc; $i < $count; $i++) {            $temp = $arr[$i];    //设置哨兵            //需将$temp插入有序增量子表            for ($j = $i - $inc; $j >= 0 && $arr[$j + $inc] < $arr[$j]; $j -= $inc) {                $arr[$j + $inc] = $arr[$j]; //记录后移            }            //插入            $arr[$j + $inc] = $temp;        }        //增量为1时停止循环    } while ($inc > 1);}$arr = array(49,38,65,97,76,13,27,48,55,04);ShellSort($arr);var_dump($arr);

时间空间复杂度

时间复杂度:
shell排序的时间复杂度是根据选中的 增量d 有关的,所以分析shell排序的时间复杂度是个比较麻烦的事;这里只给出答案,不推算了;
在最优的情况下,时间复杂度为:O(n ^ (1.3) ) (元素已经排序好顺序)
在最差的情况下,时间复杂度为:O(n ²);

空间复杂度:O(1)。

原创粉丝点击