常见的php排序算法
本文汇总了常见的php排序算法,在进行算法设计的时候有不错的借鉴价值.现分享给大家供参考之用.具体如下:
第一段:插入排序
php实现代码如下:
第二段:选择排序
第三段:冒泡排序
冒泡排序其实上是和选择排序相比,并无明显差别.都是找到最小的,放到最左端.依次循环解决问题.差别在于冒泡排序的交换位置的次数较多,而选择排序则是找到最小的元素的下标,然后直接和最左端的交换位置.
第四段:快速排序
快速排序,用语言来形容的话,从数组中选择一个值$a,然后和其余元素进行比较,比$a大的放到数组right中,反之,放到数组left中.然后将left right 分别进行递归调用,即:再细分left right ,最后进行数组的合并.
php实现快速排序:
第五段:归并排序
其实归并排序是一种拆分,合并的思想.和快速排序思想有共通之处,左边一堆,右边一堆,然后进行合并.通过递归实现排序. 区别之处呢? 他们的区别也是思想上本质的区别,快速排序的拆分,是选择了特定的值进行大小比较,从而分为left 和 right .也就是小的一堆放入left,大的一堆放入right.而后,小的left 再细分为left1 right1....通过进行类似的递归完成排序.也就是说,一直细分下去,递归最末尾的left1就是最小值.
第六段:堆排序
本例中fixDown函数实现对某一个节点的向下调整,这里默认的是起始节点为1,方便计算父子节点关系
注:
参数$k为调整点位置, $lenth为数组长度,也就是从1起始到最后一个节点的坐标.
希望本文所述排序算法实例对大家的php程序设计有所帮助.
;
算法原理
下列动图来自五分钟学算法,演示了快速排序算法的原理和步骤.
步骤:
从数组中选个基准值
将数组中大于基准值的放同一边、小于基准值的放另一边,基准值位于中间位置
递归的对分列两边的数组再排序
代码实现
function
quickSort($arr)
{
$len
=
count($arr);
if
($len
return
$arr;
}
$v
$arr[0];
$low
$up
array();
for
($i
$i
$len;
◆◆$i)
($arr[$i]
$v)
$up[]
$arr[$i];
else
$low[]
quickSort($low);
quickSort($up);
array_merge($low,
array($v),
$up);
测试代码:
$startTime
microtime(1);
$arr
range(1,
①.0);
shuffle($arr);
echo
"before
sort:
",
implode(',
',
$arr),
"\n";
$sortArr
quickSort($arr);
"after
$sortArr),
"use
time:
microtime(1)
-
$startTime,
"s\n";
测试结果:
before
①.0,
after
use
时间复杂度
这句话很好理解:假设被排序的数列中有N个数.遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N◆1)次,最多N次.
为什么最少是lg(N◆1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N◆1).所以呢,快速排序的遍历次数最少是lg(N◆1)次.
为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N.所以呢,快读排序的遍历次数最多是N次.
您可能感兴趣的文章:PHP快速排序算法实例分析PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】PHP排序算法之快速排序(Quick
Sort)及其优化算法详解PHP递归实现快速排序的方法示例php
二维数组快速排序算法的实现代码PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort实例详解
下面给你介绍四种排序方法:
①.) 插入排序(Insertion Sort)的基本思想是:?
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止.实现代码如下:
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕.实现代码如下:
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止.实现代码如下:
注:为方便描述,下面的排序全为正序(从小到大排序)
假设有一个数组[a,b,c,d]
冒泡排序依次比较相邻的两个元素,如果前面的元素大于后面的元素,则两元素交换位置;否则,位置不变.具体步骤:
①.,比较a,b这两个元素,如果ab,则交换位置,数组变为:[b,a,c,d]
完成第一轮比较后,可以发现最大的数c已经排(冒)在最后面了,接着再进行第二轮比较,但第二轮比较不必比较最后一个元素了,因为最后一个元素已经是最大的了.
第二轮比较结束后,第二大的数也会冒到倒数第二的位置.
依次类推,再进行第三轮,,,
就这样最大的数一直往后排(冒),最后完成排序.所以我们称这种排序算法为冒泡排序.
选择排序是一种直观的算法,每一轮会选出列中最小的值,把最小值排到前面.具体步骤如下:
插入排序步骤大致如下:
步骤:
从数列中挑出一个元素,称为 "基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作.
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序.
以下为十个目前最流行的基于MVC设计模式的PHP框架.
① Yii
CodeIgniter是一个应用开发框架——一个为建立PHP网站的人们所设计的工具包.其目标在于快速的开发项目:它提供了丰富的库组以完成常见的任务,以及简单的界面,富有条理性的架构来访问这些库.使用CodeIgniter开发可以往项目中注入更多的创造力,因为它节省了大量编码的时间.
CakePHP是一个快速开发PHP的框架,其中使用了一些常见的设计模式如ActiveRecord,Association Data Mapping,Front Controller以及MVC.其主要目标在于提供一个令任意水平的PHP开发人员都能够快速开发web应用的框架,而且这个快速的实现并没有牺牲项目的弹性.
PHPDevShell是一个开源(GNU/LGPL)的快速应用开发框架,用于开发不含Javascript的纯PHP.它有一个完整的GUI管理员后台界面.其主要目标在于开发插件一类的基于管理的应用,其中速度、安全、稳定性及弹性是最优先考虑的重点.其设计形成了一个简单的学习曲线,PHP开发者无需学习复杂的新术语.PHPDevShell的到来满足了开发者们对于一个轻量级但是功能完善,可以无限制的进行配置的GUI的需求.
Akelos PHP框架是一个基于MVC设计模式的web应用开发平台.基于良好的使用习惯,使用它可以完成如下任务:
◆方便的使用Ajax编写views
◆通过控制器管理请求(request)及响应(response)
◆管理国际化的应用
◆使用简单的协议与模型及数据库通信
你的Akelos应用可以在大多数共享主机服务供应方上运行,因为Akelos对服务器唯一的要求就是支持PHP.所以呢,Akelos PHP框架是理想的用于发布单独web应用的框架,因为它不需要非标准PHP配置便能运行.
这个框架的目的在于加速web应用的开发以及维护,减少重复的编码工作.
对于PHP开发者而言,使用Symfony是一件很自然的事,其学习曲线只有短短一天.干净的设计以及代码可读性将缩短开发时间.开发者可以将敏捷开发的原理(如DRY,KISS或XP等)应用在其中,将重点放在应用逻辑层面上,而不用花费大量时间在编写没完没了的XML配置文件上.
Symfony旨在建立企业级的完善应用程序.也就是说,你拥有整个设置的控制权:从路径结构到外部库,几乎一切都可以自定义.为了符合企业的开发条例,Symfony还绑定了一些额外的工具,以便于项目的测试,调试以及归档.
PRADO团队由一些PRADO狂热者组成,这些成员开发并推动PRADO框架以及相关项目的进行.
Zoop PHP框架,意为Zoop面向对象的PHP框架.
对代码并不很熟悉的开发者也可以通过Zoop快速的开发安全的web应用.熟练的开发者则可以更加将Zoop的弹性利用到极致.
Zoop由很多组件和项目集合而成,其中包括smarty和prototype AJAX框架,PEAR模块等.高效的核心组件提供了很多你原本需要自己编码来实现的功能.Zoop内置的纠错功能可以通过配置实现生产环境下的错误日志生成,这个错误日志提供了很多信息,可读性很高,可以更轻易的寻找并排除错误.
Zoop的一个特别之处在于其GuiControls,在PHP中是一个相当革新的想法.它提供了很多form widgets与验证完整的集合到一起,并形成了一个可以轻松打造个性化GuiControls的框架.
①.0. QPHP
QPHP,意为快速PHP,它是一个与ASP.NET类似的MVC框架.基本上它是这样一个情况:
◆整合了Java和C#的美感
◆除去了在其他PHP框架中使用的Perl形式的意义含糊的语言
◆大量基于OOP的概念
除了提供原始功能和生命支持的标准的全局变量,函数和类以外,它的命名空间和全局变量都是未初始化的.
通过从已知状态开始每一个请求,我们可以得到一种本质上的故障隔离;如果请求t遇到了软件的缺陷和失败,这个缺陷不会直接干扰后续的请求t◆1.
状态驻留在程序堆以外的其他地方,当然它有可能有状态地弄糟数据库,或者缓存,或者文件信息系统.
但是PHP和所有允许存在的可能环境分担了它的弱点.
隔离请求堆从另一个方面降低了大多数程序缺陷的成本.
优点二:处理并发的优势一个独立的网络请求运行在一个单独的PHP线程上.
乍看,这似乎是一个愚蠢的限制.
但是一旦你的程序执行在一个网络服务器的上下文中以后,我们就有了一个可用的自然并发:网络请求.
异步地CURL到本地服务(甚至是网络服务)提供了一个开发并行性的无共享,拷入/拷出的方式.
在实践中,这对错误来说比大多数其他通用语言提供的锁共享状态方法要更安全,更具有弹性.
优点三:事实上PHP程序在一个请求级别操作意味着程序员的工作流程是快速而有效的,并保持随着应用的变化而快速变化.
许多开发者使用的语言声称是这样,但是如果它们没有为每一个请求重置状态,主事件循环将和请求共享程序级状态,它们几乎总是需要一些启动时间.
以上就是土嘎嘎小编为大家整理的php排序算法优缺点相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!