1. 概述
- 思路:对原序进行递归二分,至剩下两个元素进行排序,回溯过程是对前面二分并排序完成的序列进行再次排序。
-
2. 实现代码
```php <?php class MergeSort { private array $ori = []; public array $new = []; public function __construct(array $arr) {
$this->ori = $arr;$r = $this->sort($this->ori, 0, count($arr) - 1);$this->new = $r;
}
// 递归 分割然后排序 private function sort(array $arr, int $l, int $r) {
if ($l == $r) return $arr;// 二分分割$mid = floor(($r - $l)/2) + $l;// 左排序$arr = $this->sort($arr, $l, $mid);// 右排序$arr = $this->sort($arr, $mid + 1, $r);$arr = $this->merge($arr, $l, $mid + 1, $r);return $arr;
}
// 将数组分割,按照 $l 和 $r 分割排序 private function merge(array $arr, int $l, int $r, int $rBound) {
$mid = $r - 1;$tmp = [];// 对两个有序数组排序$i = $l;$j = $r;$k = 0;while ($i <= $mid && $j <= $rBound) {$tmp[$k++] = ($arr[$i] <= $arr[$j]) ? $arr[$i++] : $arr[$j++];}while ($i <= $mid) $tmp[$k++] = $arr[$i++];while ($j <= $rBound) $tmp[$k++] = $arr[$j++];for ($m = 0; $m < count($tmp); $m++) {$arr[$l + $m] = $tmp[$m];}return $arr;
} }
$arr = [4, 1, 7, 8, 3, 6, 9]; $cls = new MergeSort($arr);
echo implode(‘,’, $cls->new); ```
