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 相关文章推荐
将OICQ数据转成MYSQL数据
Oct 09 PHP
PHP伪静态页面函数附使用方法
Jun 20 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 PHP
thinkphp模板的包含与渲染实例分析
Nov 26 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
PHP实现常用排序算法的方法
Feb 05 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 PHP
PHP实现本地图片转base64格式并上传
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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
document.write的几点使用心得
2014/05/14 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
详解Django中Request对象的相关用法
2015/07/17 Python
Python实现简单拆分PDF文件的方法
2015/07/30 Python
python随机数分布random测试
2018/08/27 Python
浅谈python3中input输入的使用
2019/08/02 Python
Jupyter Notebook安装及使用方法解析
2020/11/12 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
10条PHP编程习惯
2014/05/26 面试题
UML设计模式笔试题
2014/06/07 面试题
英语系本科生求职信范文
2013/12/18 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
六个一活动实施方案
2014/03/21 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
实习护士自荐信
2015/03/25 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android