- 合并排序是稳定排序,平均效率为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 )