php的希尔排序
算是改进了的插入排序,
从性能时间上来看,也确实更有改进。
但比起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的希尔排序的更多相关文章
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 希尔排序(java)
时间复杂度为O( n^(3/2) )不是一个稳定的排序算法 如何看一个算法是否稳定:{("scala",12),("python",34),("c++ ...
- Html5 希尔排序演示
希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 如下图所示: 代码如下: <!DOCTYPE html> <html& ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- 希尔排序及希尔排序java代码
原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...
- 冒泡排序 & 选择排序 & 插入排序 & 希尔排序 JavaScript 实现
之前用 JavaScript 写过 快速排序 和 归并排序,本文聊聊四个基础排序算法.(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最 ...
- 希尔排序(Shell)
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...
- 希尔排序(c++)
希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔排序是把记 ...
- JavaScript排序算法——希尔排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- IOS- 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序
/*******************************快速排序 start**********************************///随即取 当前取第一个,首先找到第一个的位置 ...
随机推荐
- 仿简书MarkDown编辑器可同步滚动
模仿简书的MarkDown编辑器,使用Angular8写的示例 1.支持同步滚动 编辑的过程中,右侧预览界面会同步滚动.滚动右侧预览界面,左侧编辑区也会同步滚动哦 2.支持语法高亮 如下: using ...
- c++动态链接问题
https://blog.csdn.net/liu0808/article/details/81169173 https://blog.csdn.net/f110300641/article/deta ...
- 超详尽-QThread的正确使用姿势-以及信号槽的跨线程使用
贴上两篇博文 一.http://www.cnblogs.com/findumars/p/5031239.html 循序渐进介绍了,怎样正确的让槽函数工作在子线程中. 同时介绍了信号槽的绑定与线程的关系 ...
- Java数组操作类
最近又重新在看慕课网的数据结构,然后把示例代码整理一下. public class Array<E> { private E[] data; private int count = 0; ...
- FineUI 模板列动态删除方法
本来这是asp.net写法,跟fineui一点关系都没有,但是还是有人不会写不会查找.还是做个分享吧. <f:TemplateField runat="server" ...
- 资源对象的池化, java极简实现,close资源时,自动回收
https://www.cnblogs.com/piepie/p/10498953.html 在java程序中对于资源,例如数据库连接,这类不能并行共享的资源对象,一般采用资源池的方式进行管理. 资源 ...
- 基于layUI调用后台数据实现区域信息级联查询
基于layUI调用后台数据实现区域信息级联查询 1.基本思路 后台提供根据区域编码查询区域列表公共接口 页面初始化调用后台接口加载所有省份 点击省份将省份区域编码传入后台查询该省份下所有地市信息,以此 ...
- mybatis逆向生成dao mapper和example.java文件
mabatis插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>myba ...
- 在Java中如何设置一个定时任务,在每天的一个时间点自动执行一个特定的程序
Quartz定时机制 首先导入jar包到程序内 quartz-all-1.6.0.jar 然后创建一个XML TimeConfig.xml 名字可以自己定义 <?xml version=&quo ...
- LRU(Least Recently Used)算法的理解
https://blog.csdn.net/wydyd110/article/details/84023688 感谢 ,自己学习记笔记 内存里建立一个哈希表,后来数据多了,爆了.咋整呢? 一个算法,就 ...