PHP 合并排序

  • 合并排序是稳定排序,平均效率为O(nlogn),需要的辅助空间是O(n)
 1 <?php
 2     #归并排序
 3     #@param    $arr    待排序数组
 4     #@param    $from    排序的起始坐标
 5     #@param    $end    排序的结束坐标
 6     function mergeSort(&$arr, $from, $end) {
 7         #切分数组直到数组元素只剩下一个
 8         if($from < $end) {
 9             $mid = floor(($from + $end) / 2);
10             mergeSort($arr, $from, $mid);
11             mergeSort($arr, $mid +1, $end);
12             
13             #合并数组
14             $tempArr = array();
15             $leftInx = $from;
16             $rightInx = $mid + 1;
17             
18             #合并左右两部,直到左边或右边部分全部排入临时数组
19             while($leftInx <= $mid && $rightInx <= $end) {
20                 if($arr[$leftInx] < $arr[$rightInx]) {
21                     $tempArr[] = $arr[$leftInx++];
22                 } else {
23                     $tempArr[] = $arr[$rightInx++];
24                 }
25             }
26             
27             #处理没有排完的一部分的剩下元素,因为待合并的部分是有序数组,剩下的元素直接全部加入临时数组
28             while($leftInx <= $mid) {
29                 $tempArr[] = $arr[$leftInx++];
30             }
31             
32             while($rightInx <= $end) {
33                 $tempArr[] = $arr[$rightInx++];
34             }
35             
36             #用临时数组的值替换掉原数组的值
37             array_splice($arr, $from, $end - $from + 1, $tempArr);
38         }
39     }
40     
41     $arr = array(1, 1, 5, 7, 2, 4, 3, 6, 3, 0);
42     mergeSort($arr, 0, count($arr) - 1);
43     print_r($arr);
44 ?>

输出

Array ( [0] => 0 [1] => 1 [2] => 1 [3] => 2 [4] => 3 [5] => 3 [6] => 4 [7] => 5 [8] => 6 [9] => 7 )

原文地址:https://www.cnblogs.com/zemliu/p/2648399.html