常用的PHP排序算法以及应用场景-归并排序
2、归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide
and
Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
[平均算法复杂度:O(n*log〈2〉n)]
应用场景分析:归并排序和冒泡排序类似,也是稳定性比较好的一种排序算法,应用场景同样也和冒泡排序类似。不同之处在于归并算法在对大数据量进行排序时,效率会明显高于冒泡排序,这点可通过对数函数曲线n*log〈2〉n与n*n的函数曲线中明显的观察到:
<?php // 归并排序: // 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 //执行时间 3.3000000000005E-5 微秒 function Merge(&$arr, $left, $mid, $right) { $i = $left; $j = $mid + 1; $k = 0; $temp = array(); while ($i <= $mid && $j <= $right) { if ($arr[$i] <= $arr[$j]) $temp[$k++] = $arr[$i++]; else $temp[$k++] = $arr[$j++]; } while ($i <= $mid) $temp[$k++] = $arr[$i++]; while ($j <= $right) $temp[$k++] = $arr[$j++]; for ($i = $left, $j = 0; $i <= $right; $i++, $j++) $arr[$i] = $temp[$j]; return $arr; } function MergeSort(&$arr, $left, $right) { if ($left < $right) { $mid = floor(($left + $right) / 2); MergeSort($arr, $left, $mid); MergeSort($arr, $mid + 1, $right); Merge($arr, $left, $mid, $right); } return $arr; } $arr = ['12','65','20','22','32','52','3']; // 记录开始时间 $time_start = microtime(); $res = MergeSort($arr,0,6); echo "<pre>"; print_r($res); echo "</pre>"; // 记录结束时间 $time_end = microtime(); $time = $time_end - $time_start; // 输出运行总时间 echo "执行时间 $time 微秒"; ?>