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类
Apr 09 PHP
php5新改动之短标记启用方法
Sep 11 PHP
php数组(array)输出的三种形式详解
Jun 05 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
Aug 20 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
php函数连续调用实例分析
Jul 30 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
May 20 PHP
PHP flush 函数使用注意事项
Aug 26 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
PHP堆栈调试操作简单示例
Jun 15 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
搜索引擎技术核心揭密
2006/10/09 PHP
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP类的封装与继承详解
2015/09/29 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
使用js 设置url参数
2013/07/08 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
js实现圆盘记速表
2015/08/03 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
js实现无缝滚动图
2017/02/22 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
python生成验证码图片代码分享
2016/01/28 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
Pytorch之parameters的使用
2019/12/31 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
印度电子产品购物网站:Vijay Sales
2021/02/16 全球购物
大学生社会实践自我鉴定
2014/03/24 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
置业顾问岗位职责
2015/02/09 职场文书
八月迷情观后感
2015/06/11 职场文书
工作经历证明范本
2015/06/15 职场文书
中学教师教学工作总结
2015/08/13 职场文书