本文给出了一个PHP排序算法合并排序的例子。分享给大家参考,如下:
基本思想:
合并排序:是利用合并的思想实现的排序方法。它的原理是,如果初始序列包含N个元素,则可视为N个有序子序列,每个子序列的长度为1,然后成对合并,得到长度为2或1的N/2 (X代表不小于X的最小整数)有序序列;成对合并,重复直到获得长度为n的有序序列,这种排序方法变成双向合并排序。
首先,合并的过程:
A[i]取A数组的前部(有序),a[j]取A数组的后部(有序)
数组存储有序的数组
比较a[i]和a[j]的大小,如果a[i] a[j],将第一个有序表中的元素a[i]复制到r[k],分别加1到I和k;否则,将第二个有序表中的元素a[j]复制到r[k]中,j和k分别加1,这样循环继续,直到其中一个有序表结束,然后将另一个有序表中的剩余元素复制到R中从下标k到下标t的单元中.合并和排序算法通常通过递归实现。首先要排序的区间[s,t]在中点分成两部分,然后对左边的子区间进行排序,再对右边的子区间进行排序。最后,通过一次合并操作将左右区间合并成有序区间[s,t]。
二、合并操作:
合并操作,也称为合并算法,是指将两个序列合并成一个序列的方法。
如果有系列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次合并后:{6,202}、{100,301}、{8,38}、{1},比较次数:3;
第二次合并后:{6,100,202,301},{1,8,38},对比次数:4;
第三次合并后:{1,6,8,38,100,202,301},对比次数:4;
比较总数为:344=11,
逆序数为14;
三、算法描述:
合并操作的工作原理如下:
第一步:申请一个大小为两个排序序列之和的空间。这个空间用于存储合并的序列
第二步:设置两个指针,其初始位置分别为两个排序序列的起始位置
第三步:比较两个指针指向的元素,选择相对较小的元素放入合并空间,将指针移动到下一个位置
重复步骤3,直到指针超过序列的结尾
将另一个序列的所有剩余元素直接复制到合并序列的末尾
算法实现:
我们先来看看主要功能部分:
//swap函数swap (array $ arr,$ a,$ b){ $ temp=$ arr[$ a];$ arr[$ a]=$ arr[$ b];$ arr[$ b]=$ temp;}//函数merge sort(array $ arr){ $ start=0;$ end=count($ arr)-1;MSort($arr,$start,$ end);}在total函数中,我们只调用了一个mssort()函数,因为我们要用递归调用,所以我们封装了mssort()。
让我们来看看MSort()函数:
函数msort (array $ arr,$ start,$ end){//当子序列长度为1,$start==$end时,无需分组if($ start $ end){ $ mid=floor($ start $ end)/2);//将$arr分成$arr[$start-$mid]和$ arr [$ mid 1-$ end] m排序(arr,$start,$ mid);//将$arr[$start-$mid]合并为有序的$ arr [$ start-$ mid] m排序(arr,$ mid 1,$ end);//将$arr[$mid 1-$end]合并为有序的$arr [$mid 1-$ end]合并($ arr,$ start,$ mid,$ end);//将$arr[$start-$mid]和$arr[$mid 1-$end]组合成一个有序的$arr[$start-$end] }}上面的MSort()函数的实现将数组分成两半,然后再分成两半(直到子序列长度为1),然后组合子序列。
现在是我们的合并操作函数Merge() :
//合并操作函数merge (array $ arr,$ start,$ mid,$ end){ $ I=$ start;$ j=$ mid 1;$ k=$ start$ temparr=array();while($i!=$中间1 $j!=$ end 1){ if($ arr[$ I]=$ arr[$ j]){ $ temparr[$ k]=$ arr[$ j];} else { $ temparr[$ k]=$ arr[$ I];} }//将第一个子序列的剩余部分添加到有序的$temparr数组中,而$i!=$ mid 1){ $ temparr[$ k]=$ arr[$ I];}//将第二子序列的剩余部分添加到有序的$temparr数组中,而($j!=$ end 1){ $ temparr[$ k]=$ arr[$ j];} for($ I=$ start;$ i=$ end$ I){ $ arr[$ I]=$ temparr[$ I];}}到了这里,我们的合并算法就完成了。让我们试着打电话:
$arr=array(9,1,5,8,3,7,4,6,2);merge sort($ arr);var _ dump($ arr);运行结果:
数组(9){[0]=int(1)[1]=int(2)[2]=int(3)[3]=int(4)[4]=int(5)[5]=int(6)[6]=int(7)[7
由于合并算法会对原始序列是否有序进行分组和比较,其最佳、最差和平均时间复杂度为O(nlogn)。
合并算法是一种稳定的排序算法。
本文参考自《大话数据结构》。只记录在这里,方便以后参考。大神不应该喷!
PS:这里推荐一个排序的演示工具,供大家参考:
在线动画演示插入/选择/冒泡/合并/希尔/快速排序过程工具:http://tools.jb51.net/aideddesign/paixu_ys
更多对PHP相关内容感兴趣的读者可以查看本网站专题:《php排序算法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》、《PHP数学运算技巧总结》、0103010
希望本文对PHP编程有所帮助。