<?php
/*
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因 DL.Shell于 1959 年提出而得名。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。
以 n=10 的一个数组 49, 38, 65, 97, 26, 13, 27, 49, 55, 4 为例第一次 gap = 10 / 2 = 5
49 38 65 97 26 13 27 49 55 4
1A 1B
2A 2B
3A 3B
4A 4B
5A 5B
1A,1B,2A,2B 等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素,每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49) (97, 55) (26, 4)这样每组排序后就变成了(13, 49) (27, 38) (49, 65) (55, 97) (4, 26),下同。
第二次 gap = 5 / 2 = 2
排序后
13 27 49 55 4 49 38 65 97 26
1A 1B 1C 1D 1E
2A 2B 2C 2D 2E
第三次 gap = 2 / 2 = 1
4 26 13 27 38 49 49 55 97 65
1A 1B 1C 1D 1E 1F 1G 1H 1I 1J
第四次 gap = 1 / 2 = 0 排序完成得到数组:
4 13 26 27 38 49 49 55 65 97
*/
function shellsort($a) {
$n = count($a);
//gap 步长
for ($gap = $n / 2; $gap > 0; $gap /= 2){
//分组
for ($i = $gap; $i < $n; $i++){
//每组排序
for ($j = $i - $gap; $j >= 0 && $a[$j] > $a[$j + $gap]; $j -= $gap){
$tmp = $a[$j];
$a[$j] = $a[$j + $gap];
$a[$j + $gap] = $tmp;
}
}
}
return $a;
}
$arr = [1,21,2,3,333,4,23];
$res = shellsort($arr);
print_r($res);
相关推荐
EnlightenGAN训练复现记录
记录EnlightenGAN过程中的问题和解决方式。提示:以下是本篇文章正文内容,下面案例可供参考。
python内置函数降序-python 使用内置函数sorted对各种数据类型进行排序
python有两个内置的函数用于实现排序,一个是list.sort()函数,一个是sorted()函数。区别1:list.sort()函数只能处理list类型数据的排序;sorted()则可以处理多种类型数据的排序。区别2:list.sort()会修改原来的list为排序后的结果;sorted()不会修改原来的数据,只是返回一个排序后的对象。下面来动手写点代码进行测试:list进行简单的排序1 >...
准静态电磁场
叠加法 缺点:对于连续分布的电荷,叠加法的计算比较困难 虚位移法 概念 广义坐标:确实系统中导体形状、尺寸与位置的一组独立几何量。 广义力:企图改变某一广义坐标的力。 功:广义力乘上由它引起的广义坐标的改变量。 公式 ...
python中的排序(升序和降序)
用sort实现升序和降序
染色体外环状DNA:肿瘤研究新方向
染色体外环状DNA(ecDNA)是癌症中活化原癌基因扩增的主要方式。区别于常染色体,这类生物大分子主要以环状的形式存在于细胞核当中,长度分布在103-106数量级,无中心粒。ecDNA序列中包含一个或者多个基因与调控元件,结构开放,转录活性强,相比于在棒状染色体结构基因,ecDNA的生物功能活性更强。癌症中,成环的基因区域拷贝数往往增高,而超过一半的高拷贝数事件是ecDNA驱动生成。...
ArcGIS+PLUS+InVEST三件套:从零搞定生态系统服务模拟预测(附完整数据包)
本文详细介绍了如何整合ArcGIS、PLUS模型和InVEST模型,构建一套完整的生态系统服务模拟预测工作流。内容涵盖从统一数据预处理、PLUS模型多情景模拟,到InVEST模型量化评估的全过程,并提供了关键脚本和避坑指南,旨在帮助研究者和从业者高效解决土地利用变化与生态系统服务评估结合的实际难题。
PHP 排序算法(五) 希尔排序
希尔排序 希尔排序又称缩小增量排序,是指将无序序列,按照增量的不同大小,分成若干个序列,然后对子序列进行插入排序,本质上就是插入排序。 思路: 我们先确定增量,一般初始增量我们都设置为数组长度的一半(向下取整); 我们根据增量,将数组分成了若干个子序列: 分别对这四个子序列进行插入排序: 然后再一次遍历,增量设置为原先的一半,也就是继续除以2(向下取整),得出的序列: 分别对这两个序列进行插入排序,结果为: 再将增量除以2得到新增量为1,便...
SAP PS模块实战指南:从项目启动到结算的全流程解析
本文详细解析SAP PS模块在项目管理中的全流程应用,从项目启动到结算的关键操作与实战技巧。通过WBS设计、预算控制和资源调配等核心功能,帮助管理者高效协调项目进度与成本,特别适用于交付型和成本型项目管理。掌握PS模块能显著提升项目管理效率与精准度。
【算法基础】希尔排序解析
希尔排序由希尔(Donald Shell)在 1959 年所发表的论文“A high-speed sorting procedure”中提出,因此便以其名字进行命名。希尔排序的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
微信小程序审核避坑指南:巧用 wx.getAccountInfoSync 实现审核与线上环境无感切换
本文详细介绍了如何利用`wx.getAccountInfoSync`API实现微信小程序审核与线上环境的无感切换。通过环境识别技术和动态渲染架构设计,开发者可以优雅解决审核资质门槛问题,同时保持生产环境的完整用户体验。文章包含组件化实现、全局状态管理等实用方案,帮助开发者提升审核通过率。
逆向工程师视角:拆解DataDome滑块验证码的3层防护机制与绕过思路
本文从逆向工程师视角,深入剖析DataDome滑块验证码的三层核心防护机制。第一层通过动态加密参数实现会话绑定与抗重放;第二层采集TLS指纹、鼠标轨迹动力学等多维行为数据进行一致性验证;第三层则是基于机器学习的后端异步风险决策引擎。文章不仅拆解了其技术原理,更分享了模拟、钩取等超越单纯工具调用的底层分析与绕过思路。
排序算法 - 希尔排序
希尔排序(Shell Sort)也叫,是基于插入排序的一种排序算法。它通过将待排序数据按某个增量分为若干组,对每组数据进行插入排序,随着增量逐渐减小,每组包含的元素越来越多,当增量减至1时,整个数据合成一组,再进行插入排序,最终完成排序。希尔排序的核心思想是使数组中任意间隔为的元素都是有序的,这样的数组被称为h有序数组。
VMware ESXi +DELL虚拟化存储磁盘容量处于紧急状态问题的处理
1、环境介绍 exsi server两台(DELL R730 ): 192.168.3.206 VMware EXSi6.5 192.168.3.207 VMware EXSi6.5 磁盘存储柜一台(DELL SC2000): 192.168.3.208 2、故障处理 由于前期规划的卷空间过大,虚拟机文件逐年增大以后,造成卷的磁盘占用过与整个磁盘空间的容量,虚拟化平台可用容量爆掉,DELL SC2000自动切换到紧急状态,禁止所有磁盘I/O,exsi主机上的虚拟机无法开机 首先,安装
php 希尔排序
/* 1、间隔为4,每间隔4个人,这些人排成一组 2、在每一组的组内进行排序,数组交换,比大小 3、重新设置间隔分组,例如 黄色一组 ,黑色一组 、在进行组内排序交换(用的是插入法) 重点、分组的间隔都会越来越小,最后变成1,如果变成1的时候,说明已变成了一组 排序用的是插入排序 分组间隔不停的减少,不停的分组,不停做组内的排序最终变为1为止 */ 希尔排序算法的php实现2 php实现希尔排序 ...
数学建模模型总结
这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!
lwip-2.0.3
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。
php 希尔排序算法
希尔排序 希尔排序(Shell’s Sort)是 插入排序 的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序的最好时间复杂度O(n)和最坏时间复杂度O(n2)。想要理解希尔排序,首先得理解插入排序。 图解参考: 参考文章: https://www.cnblogs.com/chengxiao/p/6104371.html https://zhuanlan.zhihu.com/p/56836177 以下是希尔排序的php版本
霍尼韦尔SoftMaster使用说明
霍尼韦尔SoftMaster使用说明
PHP-希尔排序
function shell(array $arr,array $gaps=[]){ if(!$arr) return $arr; //测试用,默认指定间隔数组,正常传入即可 $gaps = [10,5,2,1]; $l_g = count($gaps); $l = count($arr); for($i=0;$i<$l_g;$i+...
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
希尔排序算法的php实现
虽然现在各种程序语言都有其各自强大的排序库函数,但是这些底层实现也都是利用这些基础或高级的排序算法。 理解这些复杂的排序算法还是很有意思的,体会这些排序算法的精妙~ 一、希尔排序(shell sort):希尔排序是基于插入排序的,区别在于插入排序是相邻的一个个比较(类似于希尔中h=1的情形),而希尔排序是距离h的比较和替换。 希尔排序中一个常数因子n,原数组被分成各个小...
php实现希尔排序
PHP实现希尔排序希尔排序是在插入排序的基础上改进的版本,效率更高一点。它是以一个增量来组成序列进行排序的。直接上代码function shellSort($arr) { $len = count($arr); $count = $len; //数组长度 do { $len = intval($len /3) + 1;//以3为增量,具体计算方法 2^t-k+1 -1 (0<=k<...
希尔排序-PHP版
<?php function shellSort($arr) :Array { if($arr == null || count($arr) <=1){ return $arr; } //希尔排序 升序 for($d = floor(count($arr)/2);$d>0;){ //$d:增量 7 3 1 ech...
PHP排序算法系列:希尔排序
希尔排序希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。原理先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。希尔排序过程PHP代码实现function
php实现希尔排序(总结)
php实现希尔排序(总结) 一、总结 1、希尔排序的算法思路:分组排序,缩小增量排序,插入排序 2、算法思路: 循环非常好写 有几次gap:log2(n) 每次gap有几组:gap组 每组有几个元素:以gap做增加量就知道了 然后每组的几个元素做简单插入排序就好 二、希尔排序 希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Dimin...
PHP 希尔排序
希尔排序平均时间复杂度O(n^1.3),最好情况O(n),最坏情况O(n^2) 1 <?php 2 #希尔排序 3 function shellSort(Array $arr) { 4 $k = initStep(count($arr)); 5 $step = pow(2, $k) - 1; 6 ...
PHP基础排序算法(五)希尔排序
PHP基础排序算法之希尔排序 <?php /** * @希尔排序 * @排序思路: * 严格来说基于插入排序的思想,也叫缩小增量排序或Shell排序。 * @流程: * (1)将有n个元素的数组分成n/2个数字序列,第1个数据和n/2+1个数据为一对,...... * (2)一次循环使每个序列对排好顺序。 * (3)然后,再变为n/4个序
希尔排序学习及PHP实现
在看希尔排序时比较难以理解,并且没有看懂是如何排出来的https://visualgo.net/zh 也没有这种排序于是使用php写了代码实现并将每一步打印出来,总算看明白排序的过程了虽然还是不懂这个原理 上代码 <?php function ss($arr){ $n=count($arr); $h=1; while($h<$n/3)$h=3*$h+1; ...
希尔排序 php实现
<?php /* * 希尔排序 */ set_time_limit(0); header("Content-Type:text/html;charset=utf-8"); $dataLen=20001; $data=array(); $i=0; //make data srand(time()); for($i=0; $i < $dataL...
3846



被折叠的 条评论
为什么被折叠?



