归并排序
时间复杂度O(NlgN)
分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
http://www.cnblogs.com/Creator/archive/2011/06/18/2084267.html
<?php function t_sort(&$arr,$start,$end){ if($start<$end){ $mid=intval(($start+$end)/2); t_sort($arr,$start,$mid); t_sort($arr,$mid+1,$end); merge_sort($arr,$start,$mid,$end); } } function merge_sort(&$arr,$start,$mid,$end){ for($i=$start;$i<=$mid;$i++){ $arrA[]=$arr[$i]; } for($j=$mid+1;$j<=$end;$j++){ $arrB[]=$arr[$j]; } $i=0;$j=0;$k=0; while($i<count($arrA)&&($j<count($arrB))){ if($arrA[$i]<=$arrB[$j]){ $arr[$start+$k]=$arrA[$i]; $i++; } else{ $arr[$start+$k]=$arrB[$j]; $j++; } $k++; } while($i<count($arrA)){ $arr[$start+$k]=$arrA[$i]; $i++; $k++; } while($j<count($arrB)){ $arr[$start+$k]=$arrB[$j]; $j++; $k++; } } $arr=array(2,1,3,4,5,10,9,7,8,3,2,12,4,5); t_sort($arr,0,count($arr)-1); print_r($arr);