本文总结了常用的php排序算法,对算法的设计有很好的参考价值,现供大家参考:

插入排序

一个简单的文字描述,比如$ ARR =阵列(4,2,4,6,3,6,1,7,9);这样一组数字:

所以,首先,比较二元阵列的第一要素,如果第一个元素大于二元素,然后让他们采取下一步的位置互换,数组的第三个元素,分别为,和第二,与第一单元相比,如果第三元是小,然后互换。比喻反过来,这是插入排序,其时间频率:1 + 2 +…+(n-1)=(N ^ 2)/ 2.its时间复杂度为O(n ^ 2)。

PHP实现代码如下所示:


< PHP
函数插入排序($ ARR){
$count =计数($ ARR);
如果(计数为2){
返回的数组;
}
($ i = 1;$ i <计数;$ + +){
TMP =美元美元美元ARR {我};
J = $ I-1;
而(J > = 0美元美元美元,<< ARR { } { } {我ARR美元)
ARR {我} =美元美元美元美元ARR {,};
ARR { } =美元美元美元,TMP;
美元—;
}
}
返回的数组;
}
>




两。选择排序

你可以选择一种语言来描述它,如:$ ARR =阵列(4,3,5,2,1);

首先,先毕竟比找到最低的数字,然后交换第一个数组(当然,如果是第一个最小值,然后不掉),然后循环,即:比较二和后来发现的最小数目,然后第二数字交换反过来,也就是说,每次都是找出最小剩余价值。可用:第一,时间频率为n,(的N-1,第一和背面找到最小的,看看是不是第一,不是第一的话,在后面,其次是互换)减一。其时间复杂度为O(n ^ 2);

PHP实现代码如下所示:


< PHP
功能选择排序($ ARR){

$count =计数($ ARR);
如果(计数为2){
返回的数组;
}
($ i = 0;$ i <计数;$ + +){
分钟= $ i;
对于(j = $ i + 1;$ j $计数;$ + +){
如果($ ARR { $分钟} > $ ARR { $ J }){
$ = $ j; /查找最小的元素。
}
}
如果(最小)!= i)如果索引不是$ i交换。
TMP =美元美元美元ARR {我};
ARR {我} =美元美元美元美元ARR {民};
ARR { } =美元美元美元分钟TMP;
}
}
返回的数组;
}
>




三、冒泡排序



冒泡排序是排序的选择相比无显著差异,找到最小的,最左边依次结束。解决问题。不同的是,在冒泡排序交换位置,数量大,分选是找到最小的元素的下标,然后直接和左之间的位置。



PHP实现代码如下所示:


< PHP
功能选择排序($ ARR){

$count =计数($ ARR);
如果(计数为2){
返回的数组;
}
($ i = 0;$ i <计数;$ + +){
对于(j = $ i + 1;$ j $计数;$ + +){
如果($ ARR { $我} > $ ARR { $ J }){
TMP =美元美元美元ARR {我};
ARR {我} =美元美元美元美元ARR {我};
ARR {我} =美元美元美元的TMP;
}
}
}
返回的数组;
}
>




四。快速排序

快速排序,使用语言描述,从数组中选择一个值a,然后与其他元素进行比较,把它放在数组中大于A的数组中,否则,把它放在数组左边,然后左向右递归地调用,也就是说,左权被细分,然后数组被合并。

php实现快速排序:




< PHP
功能mysort($ ARR){

$count =计数($ ARR);
如果(计数为2){
返回的数组;
}
关键词=美元美元ARR { 0 }; / /选择第一个元素与其他元素相比,可选
$ =数组();
数组();
($ i = 1;$ i <计数;$ + +){
如果($键> = $ ARR { $我}){
为左{ } = {我} ARR美元美元;
其他{ }
$权{ } = {我} ARR美元美元;
}
}
左= mysort美元(美元左右);
右(右mysort美元美元);
结果= array_merge美元(美元美元左,右);
返回$结果;
}
>




五、合并排序

事实上,这种合并是一种分裂合并的思想,它与快速排序、左堆、右堆、合并等概念有着共同之处,排序是通过递归实现的,有什么区别呢他们的不同之处在于思想的本质不同。的快速排序的分辨率为大小的比较具体的价值选择,它分为左、右,小桩放在左边,并放入正确的大桩。然后,小左再细分为left1 right1。通过类似的递归排序。也就是说,对递归结束的left1是最小的。

归并排序是从几何左右分割,并被递归地分割成2个或1个最小尺寸的阵列,然后开始比较大小和合并。这里比较大小,儿子留下的元素与儿子的右元相比,然后排序合并到父亲的离开还是正确的。在这里,直到你得到每个排序合并完成最后两阵:先左后右,但直到他们的订单,并不能确认整个数组的顺序,最终还是通过左右比较合并后,实现了真正意义上的秩序。


< PHP
功能gbsort($ ARR){
如果(计数($ ARR)<= 1){ return $ ARR;}
$分钟=地板(计数($ ARR) / / / 2);取中间数分
左= array_slice美元(美元啊,0,$分钟);
右array_slice美元($ ARR,$分钟);
左= gbsort美元(美元左右); / /递归
$right = gbSort ($right);
返回get_merge(美元左右美元); / /归并排序归并函数调用
}
功能get_merge(美元左右美元){
同时(计数(左)计数(右)){
$ M { } = { 0 } >美元美元左右{ 0 } array_shift($右):array_shift($左);
将比较小并移除到数组m中。
}
返回arr_merge(百万美元美元,左,右); / /合并(左权,因为他们不知道这将是空的,所以综合)
}

>




六、堆排序

在这种情况下,该fixdown功能实现了向下调整的一个节点。默认情况下,起始节点为1,便于计算父-子关系。

注:

起始节点是1父子关系:k、2K、2K + 1子节点j的父节点,父节点是楼层(j/2)楼层。

起始节点的0个关系:父母K,子节点的2k + 1,2k + 2子节点和父节点j,地板(((J-1) / 2)。

参数k是调整点的位置,和$长度是数组的长度,即从1到最后一个节点的坐标。


< PHP
功能fixdown(美元美元美元ARR,K,长度)
{
而(2×k < = $长度){ / /如果当前节点的子节点,将需要继续循环
$ = $ k * 2;
如果(J <美元美元美元} {长度度{J}. <<美元ARR { $ J + 1 } J + +); / /只要右子节点的节点,节点和右比左节点,然后切换到正确的节点操作。
如果打破($ ARR { $ J } { } $ K < $ ARR); / /如果子节点没有父节点,然后调整结束。
汇率(美元ARR { $ J },{ $ K $ ARR });
美元= J;
}
}

功能交换($,$){
$;
}

功能headsort($ ARR)
{
$ len =计数($ ARR);
array_unshift($ ARR,null);
对于($ $ = $ 2;$ i = 1;$ i){
fixdown(ARR美元美元美元,我,Len);
}
当($ > 1){
汇率(美元ARR { 1 },{ }美元美元arr len);
fixdown($ 1美元的ARR,Len);
}
array_shift($ ARR);
}
$ ARR =阵列(4,6,4,9,2,3);
headsort($ ARR);
>




希望本文中所描述的排序算法的示例有助于PHP程序的设计。