对于排序的算法我想大家首先想到的事  冒泡排序;快速排序;或者想起选择和插入排序;

今天的讲解并不是以上四种;而是希尔排序;

对18W个数字排序,时间比较(毫秒) 希尔排序 0.1s 就完成了,有点不敢相信,插入排序用了4.2s

理解这些复杂的排序算法还是很有意思的,体会这些排序算法的精妙~

  一、希尔排序(shell sort):希尔排序是基于插入排序的,区别在于插入排序是相邻的一个个比较(类似于希尔中h=1的情形),而希尔排序是距离h的比较和替换。

希尔排序中一个常数因子n,原数组被分成各个小组,每个小组由h个元素组成,很可能会有多余的元素。当然每次循环的时候,h也是递减的(h=h/n)。第一次循环就是从下标为h开始。希尔排序的一个思想就是,分成小组去排序。

理解这些算法,最好是有个图示。就先来代码吧。

  1. <?php
  2.  
  3. /**
  4. * 希尔排序
  5. */
  6. function shell_sort(array $arr){
  7. // 将$arr按升序排列
  8. $len = count($arr);
  9. $f = 3;// 定义因子
  10. $h = 1;// 最小为1
  11. while ($h < $len/$f){
  12. $h = $f*$h + 1; // 1, 4, 13, 40, 121, 364, 1093, ...
  13. }
  14. while ($h >= 1){ // 将数组变为h有序
  15. for ($i = $h; $i < $len; $i++){ // 将a[i]插入到a[i-h], a[i-2*h], a[i-3*h]... 之中 (算法的关键
  16. for ($j = $i; $j >= $h; $j -= $h){
  17. if ($arr[$j] < $arr[$j-$h]){
  18. $temp = $arr[$j];
  19. $arr[$j] = $arr[$j-$h];
  20. $arr[$j-$h] = $temp;
  21. }
  22. //print_r($arr);echo '<br/>'; // 打开这行注释,可以看到每一步被替换的情形
  23. }
  24. }
  25. $h = intval($h/$f);
  26. }
  27. return $arr;
  28. }
  29.  
  30. $arr = array(14, 9, 1, 4, 6, -3, 2, 99, 13, 20, 17, 15, 3);
  31.  
  32. $shell = shell_sort($arr);
  33.  
  34. echo '<pre>';
  35. print_r($shell);
  36.  
  37. /**
  38. *
  39. Array
  40. (
  41. [0] => -3
  42. [1] => 1
  43. [2] => 2
  44. [3] => 3
  45. [4] => 4
  46. [5] => 6
  47. [6] => 9
  48. [7] => 13
  49. [8] => 14
  50. [9] => 15
  51. [10] => 17
  52. [11] => 20
  53. [12] => 99
  54. )
  55. )
  56. *
  57. */
  58. ?>

php实现希尔排序的更多相关文章

  1. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  2. 希尔排序(java)

    时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...

  3. Html5 希尔排序演示

    希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 如下图所示: 代码如下: <!DOCTYPE html> <html& ...

  4. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  5. 希尔排序及希尔排序java代码

    原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...

  6. 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现

    之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...

  7. 希尔排序(Shell)

    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...

  8. 希尔排序(c++)

    希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔排序是把记 ...

  9. JavaScript排序算法——希尔排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序

    /*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...

随机推荐

  1. Python_day01——字符串

    https://www.cnblogs.com/A-FM/p/5691468.html def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 # 获 ...

  2. Web API 上传下载文件

    1.引用了一个第三方组件 ICSharpCode.SharpZipLib.Zip; 2.具体代码 实体类,可以用hashtable 替代 ,感觉hashtable 比较灵活 public class ...

  3. sql join 的一次小使用

    表为: 列名:站号,模式名,偏差,日期,要素 试图查询每个站中最小的那个偏差的模式名 create table B as SELECT stationid,min(abserror) as minab ...

  4. Java学习记录--ModelMapper的使用

    在项目中很多时候需要把Model和DTO两个模型类来回转换,保证Model对外是隐私的,同时类似密码之类的属性也能很好地避免暴露在外了. 那么ModelMapper就是为了方便转换而实现的一个类库,下 ...

  5. 【DM642】ICELL Interface—Cells as Algorithm Containers

    ICELL Interface—Cells as Algorithm Containers: DSP的算法标准(XDAIS)为算法提供了一个标准的接口.这样我们就可以使用第三方的算法.For tech ...

  6. 009-python一些问题整理

    1. Python中的 // 与 / 的区别 " / "  表示浮点数除法,返回浮点结果 >>> 90/30 3.0 " // " 表示整数除 ...

  7. Mybatis逆向工程文件标签的详细介绍:

    ?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUB ...

  8. TZOJ 1503 Incredible Cows(折半搜索+二分)

    描述 Farmer John is well known for his great cows. Recently, the cows have decided to participate in t ...

  9. 使用 git 及 github

    1.github 开户.创建项目 2.以下是本地操作: #初始本地库 git init#设置git的全局邮箱和用户名git config --global user.email "<e ...

  10. 群晖安装transmission

    首先 需要添加第三方的套件下载地址 http://packages.synocommunity.com/ 然后找到tr 根据需要设置文件夹路径 因为我需要跑rss,所以用到了flexget,先放这里 ...