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动态创建Flash动画
Oct 09 PHP
PHP中for循环语句的几种变型
Mar 16 PHP
深入理解php的MySQL连接类
Jun 07 PHP
php检测useragent版本示例
Mar 24 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
smarty缓存用法分析
Dec 16 PHP
php脚本运行时的超时机制详解
Feb 17 PHP
PHP面向对象程序设计之对象生成方法详解
Dec 02 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 23 PHP
PHP 实现base64编码文件上传出现问题详解
Sep 01 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
PHP开发过程中常用函数收藏
2009/12/14 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
ansible作为python模块库使用的方法实例
2017/01/17 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
python实现学员管理系统
2019/02/26 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
详解python tcp编程
2020/08/24 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
2014年村官工作总结
2014/11/24 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
同意报考证明
2015/06/17 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
Python上下文管理器Content Manager
2021/06/26 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python