当前位置: 首页 > 后端技术 > PHP

PHP归并排序(MergeSort)

时间:2023-03-29 23:50:12 PHP

归并排序时间复杂度属于O(nlogn)级别,相对于O(n^2)级别的排序算法,在处理大量数据时其优势非常明显,下面介绍通过示意图和代码演示,归并排序如何达到O(nlogn)时间复杂度级别。1.将数组的两个有序部分合并为一个示意图在学习归并排序之前,先学习利用临时空间将数组的两个有序部分合并为一个有序部分的示意图。Tips:额外使用空格,最后将排序后的值赋值给原变量。合并代码如下:=$left&&$aIndex<$mid)||($bIndex>=$mid&&$bIndex<=$right)){$aValue=$arr[$aIndex]??null;$bValue=$arr[$bIndex]??null;如果(($aIndex<$left||$aIndex>=$mid)||($bValue<$aValue&&$bValue!=null)){$crr[]=$bValue;$b索引++;}else{$crr[]=$aValue;$索引++;}}对于($i=0;$i<($right-$left);$i++){$arr[$i+$left]=$crr[$i];}返回$arr;}$arr=[1,4,7,10,15,8,11,13,19,24];print_r(twoMergeSort($arr,0,5,9));/**数组([0]=>1[1]=>4[2]=>7[3]=>8[4]=>10[5]=>11[6]=>13[7]=>15[8]=>19[9]=>24)*/2。无序数组分解图可以利用递归二分法的思想来划分一个无序有序数组分解对于多个单元素数组(单元素数组也可以看成是有序数组)Tips:可以用递归的思想来实现归并排序3.合并排序代码=$left&&$aIndex<$mid)||($bIndex>=$mid&&$bIndex<=$right)){$aValue=$arr[$aIndex]??无效的;$bValue=$arr[$bIndex]??null;如果(($aIndex<$left||$aIndex>=$mid)||($bValue<$aValue&&$bValue!=null)){$crr[]=$bValue;$b索引++;}else{$crr[]=$aValue;$索引++;}}对于($i=0;$i<($right-$left);$i++){$arr[$i+$left]=$crr[$i];}返回$arr;}公共函数arrayMergeSort($arr){$this->recursionMergeSort($arr,0,count($arr)-1);返回$arr;}私有函数recursionMergeSort($arr,$left,$right){if($left==$right){return;}$mid=ceil((($right-$left)/2)+$left);//($right+$left)/2这种考虑内存溢出的优化$arr=$this->recursionMergeSort($arr,$left,$mid-1);//递归思想,交给下层处理$arr=$this->recursionMergeSort($arr,$mid,$right);//递归思想,交给Sort下层处理$arr=$this->twoMergeSort($arr,$left,$mid,$right);//合并两个有序的内容return$arr;}}4.demo输出代码如下arrayMergeSort([1,3,2,4,5,9,6,7,8]));如下图所示:5.O(nlogn)和O(n^2)时间复杂度的简单比较