归并排序(快速排序)
分治法:将原问题分解为几个规模较小但类似的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解
在最坏、最佳、平均情况下归并排序时间复杂度均为o(nlogn)
代码实现
<?php
function merge(&$arr, $p, $q, $r)
{
$temp = [];
$i = $p;
$j = $q + 1;
while ($i <= $q && $j <= $r) {
if ($arr[$i] < $arr[$j]) {
$temp[] = $arr[$i++];
} else {
$temp[] = $arr[$j++];
}
}
while ($i <= $q) {
$temp[] = $arr[$i++];
}
while ($j <= $r) {
$temp[] = $arr[$j++];
}
for ($k = 0, $len = count($temp); $k < $len; $k++) {
$arr[$p + $k] = $temp[$k];
}
}
function mergeSort(&$arr, $p, $r)
{
if ($p < $r) {
$q = floor(($p + $r) / 2);
mergeSort($arr, $p, $q);
mergeSort($arr, $q + 1, $r);
echo 'p->'.$p.' q->'.$q.' r->'.$r.PHP_EOL;
merge($arr, $p, $q, $r);
}
}
$arr = [4, 3, 2, 1];
mergeSort($arr, 0, count($arr) - 1);
var_dump($arr);