PHP排序算法之希尔排序(Shell Sort)实例分析


Posted in PHP onApril 20, 2018

本文实例讲述了PHP排序算法之希尔排序(Shell Sort)。分享给大家供大家参考,具体如下:

基本思想:

希尔排序是指记录按下标的一定增量分组,对每一组使用 直接插入排序 ,随着增量逐渐减少,每组包含的关键字越来越多,当增量减少至 1 时,整个序列恰好被分成一组,算法便终止。

操作步骤:

先取一个小于 n(序列记录个数) 的整数 d1 作为第一个增量,把文件的全部记录分组。所有距离为 d1 的倍数的记录放在同一个组中。先在各组内进行 直接插入排序;然后,取第二个增量 d2 < d1 重复上述的分组和排序,直至所取的增量 dt=1( dt < d(t-1) …< d2 < d1),即所有记录放在同一组中进行 直接插入排序 为止.

该方法实质上是一种分组插入方法

比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[2] 较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

一般的初次取序列的一半为增量,以后每次减半,直到增量为1。

关于增量的取法,据说迄今为止还没有找到一种最好的增量序列,不过有一个强烈的要求是 最后一个增量值必须等于 1 才行。

给定实例的shell排序的排序过程

假设待排序文件有10个记录,其关键字分别是:

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次为:

5,3,1

PHP排序算法之希尔排序(Shell Sort)实例分析

算法实现:

<?php
//希尔排序(对直接插入排序的改进)
function ShellSort(array &$arr)
{
  $count = count($arr);
  $inc = $count;  //增量
  do {
    //计算增量
    //$inc = floor($inc / 3) + 1;
    $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(9,1,5,8,3,7,4,6,2);
$arr = array(49,38,65,97,76,13,27,49,55,04);
ShellSort($arr);
var_dump($arr);

运行结果:

array(10) {
 [0]=>
 int(4)
 [1]=>
 int(13)
 [2]=>
 int(27)
 [3]=>
 int(38)
 [4]=>
 int(49)
 [5]=>
 int(49)
 [6]=>
 int(55)
 [7]=>
 int(65)
 [8]=>
 int(76)
 [9]=>
 int(97)
}

复杂度分析:

通过以上代码的分析,相信大家已经有些明白,希尔排序的关键并不是随便分组后各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。

最坏的情况下时间复杂度是 O(n^2)

希尔排序是不稳定排序。

本文参考自《大话数据结构》,在此仅作记录,方便以后查阅,大神勿喷!

PHP 相关文章推荐
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
php多文件打包下载的实例代码
Jul 12 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
Oct 18 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
Apr 20 #PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
Apr 20 #PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 #PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
Apr 20 #PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 #PHP
Laravel 加载第三方类库的方法
Apr 20 #PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 #PHP
You might like
8个PHP数组面试题
2015/06/23 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
JavaScript 字符编码规则
2009/05/04 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
Python合并多个装饰器小技巧
2015/04/28 Python
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
门卫班长岗位职责
2013/12/15 职场文书
初中英语教学反思
2014/01/25 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
英语感谢信范文
2015/01/20 职场文书
民事答辩状格式范文
2015/05/21 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
《槐乡的孩子》教学反思
2016/02/20 职场文书