希尔排序
来源:互联网 发布:回转交易 知乎 编辑:程序博客网 时间: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)。
阅读全文
0 0
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- Spring-boot修改内置服务器的上下文根及端口号
- arm 待机指令 WFI和WFE
- Kotlin 入门
- 2017 谷歌I/O大会
- js-纳税人识别码验证
- 希尔排序
- jQuery读书笔记
- CSDN博客的GIF(动态图)制作及上传
- 利用resnet 做kaggle猫狗大战图像识别,秒上98准确率
- 各种变量的定义规则和使用规则?
- linux下安装docker
- JAVA基础(六)之Servlet
- 接口测试--postman interceptor插件
- D3D9函数(持续添加)