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 相关文章推荐
smarty的保留变量问题
Oct 23 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
php垃圾代码优化操作代码
Aug 05 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
Dec 25 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
Jan 22 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
Apr 09 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 PHP
php生成短网址/短链接原理和用法实例分析
May 29 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+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
use jscript List Installed Software
2007/06/11 Javascript
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
机械工程系毕业生求职信
2013/09/27 职场文书
公司寄语大全
2014/04/10 职场文书
支部书记四风对照材料
2014/08/28 职场文书
2015年检验科工作总结
2015/04/27 职场文书
历史博物馆观后感
2015/06/05 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript