算是改进了的插入排序,

从性能时间上来看,也确实更有改进。

但比起php内置的功能,性能还有十倍之差呢

<?php
/**
 * 原理:把排序的数据根据增量分成几个子序列,对子序列进行插入排序,
 * 直到增量为1,直接进行插入排序,增量的排序,一般是数组长度的一半,再变为原来增量的一半,直到增量为1
 * 时间复杂度:最差 Θ(n2) 平均时间复杂度 O(log2n)
 * 最差的情况:因为$gap的值不互质(最大公因数不是1)所以导致增量序列没有起到作用
 * 可以使用例如 Hibbrd增量序列
 */

    //生成指定区间不重复数组
    function uniqueRandom($min, $max, $num) {
        $count = 0;
        $return = [];

        while($count < $num) {
            //生成指定数值期间的随机数
            $return[] = mt_rand($min, $max);
            //用两次键值翻转,去除数组中重复的数据项
            $return = array_flip(array_flip($return));
            $count = count($return);
        }
        //再次作一下随机排序
        shuffle($return);
        return $return;
    }

    //希尔排序,插入排序的改进版
    function shellSort(&$arr):void {
        $count = count($arr);
        //希尔增量序列
        for ($gap=intval($count/2); $gap>0; $gap=intval($gap/2)) {
            //插入排序
            for ($p=$gap; $p<$count; $p++) {
                //摸下一张牌
                $temp = $arr[$p];
                for ($i=$p; $i>= $gap && $arr[$i-$gap]>$temp; $i-=$gap) {
                    //移出空位
                    $arr[$i] = $arr[$i - $gap];
                }
                //新牌落位
                $arr[$i] = $temp;
            }
        }

    }

    $arr = uniqueRandom(1, 100000, 5000);
    $start = microtime(true);
    shellSort($arr);
    $end = microtime(true);
    $used = $end - $start;
    echo "insertSort() used $used s" . PHP_EOL;
    echo '<br/>';
    /*
    for ($i = 0; $i < count($arr)/100; $i++) {
        echo $arr[$i] . '<br/>';
    }
    */
    //php内置排序, 性能超过自己写的好多倍~~:()
    $arr = uniqueRandom(1, 100000, 5000);
    $start = microtime(true);
    asort($arr);
    $end = microtime(true);
    $used = $end - $start;
    echo "asort() used $used s" . PHP_EOL;
    echo '<br/>';
?>

输出:

insertSort() used 0.011000871658325 s
asort() used 0.0010008811950684 s 

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. maven工程仿springboot手写代码区分开发测试生产

    读取代码: package com.jz.compute.mc.v2.config; import java.util.Enumeration; import java.util.ResourceBu ...

  2. 【MongoDB学习之二】MongoDB数据库、文档、集合、元数据

    环境 MongoDB 4.0 CentOS6.5_x64 一.连接语法格式: mongodb://[username:password@]host1[:port1][,host2[:port2],.. ...

  3. Java byte和hex十六进制字符串转换

    在Java中字符串由字符char组成, 一个char由两个byte组成, 而一个byte由八个bit组成, 一个十六进制字符(0-F)实际上由4个字节byte即可表达, 因此, 从字节数组到十六进制字 ...

  4. 嵌入式02 STM32 实验08 外部中断

    一.中断 由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理事件的一个程序.该程序执行完成后,CPU接着执行被暂停的程序.这个过程称为中断.(我正在捉泥鳅,但是我妈喊我回家吃饭,我必须回家 ...

  5. ZLC众利币系统APP开发

    开发版本:APP 开发语言:php,java,.net 下面我们来看一下tp5 分页具体怎么用: 一, 分页简洁版 简洁分页仅仅只有上下页的分页输出,可以使用下面的简洁分页代码: // 查询状态为1的 ...

  6. Python知识点总结篇(三)

    文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量: 通过句柄对文件进行操作: 关闭文件: with:自动关闭文件: with open('log', 'r') as f: ... 文件 ...

  7. python递归函数和河内塔问题

    关于递归函数: 函数内部调用自身的函数. 以n阶乘为例: f(n) = n ! = 1 x 2 x 3 x 4 x...x(n-1)x(n) = n x (n-1) ! def factorial(n ...

  8. 【EBS】菜单的复制脚本

    DECLARE l_error_flag ); l_menu_rowid ); l_menu_entity_rowid ); l_menu_id NUMBER; l_cnt ; c_new_menu_ ...

  9. 如何在Job中获取 IOC applicationcontext

    如何在Job中获取 IOC applicationcontext https://segmentfault.com/q/1010000008002800 SpringBoot之整合Quartz调度框架 ...

  10. 使用 EnumWindows 找到满足你要求的窗口

    原文:使用 EnumWindows 找到满足你要求的窗口 在 Windows 应用开发中,如果需要操作其他的窗口,那么可以使用 EnumWindows 这个 API 来枚举这些窗口. 本文介绍使用 E ...