標籤:des style blog class code java
在我們日常的程式開發時候,有時候需要對一個已知的集合按照一定的規則進行排序,其實當資料的規模不太大時或者資料的有序特徵比較明顯,其實我們可以採用其它的排序演算法例如:Bubble Sort, Insertion Sort , Shell Sort 等。 但是前面3中演算法的共同特點是,都是從原始的列表裡把元素兩兩取出,然後進行比較,顯然冒泡排序和插入排序使用了太多的比較,在資料規模增大時,優勢明顯下降(主要是以每種演算法的複雜度O為參考)。所以這裡我們可以嘗試用替代法,可以嘗試將列表分成更小的子列表然後對他們排序,在排序完更小的子列表後,再將小的子列表合并成一個有序列表,這種方法就是典型的“分治法”,分而治之,逐個克服.(Divide and Conquer).
一般來說,如果一個問題太難以至於無從下手,我們可以嘗試將它分成較小的子問題,然後嘗試解決這些子問題,最後把這些子問題的結果合并起來。從而解決原始問題。
是以一個較短的數組為例來展示整個排序過程:
下面是用PHP code 實現的,以上面的元素為例,著這裡主要是借用PHP的2個函數來完成的(array_slice,array_splice).
1 <?php 2 3 4 $input = array(6,3,2,7,1,5,8,4); 5 6 7 function merge_sort($arr) 8 { 9 if(count($arr) <= 1){10 return $arr;11 }12 13 $left = array_slice($arr,0,(int)(count($arr)/2));14 $right = array_slice($arr,(int)(count($arr)/2));15 16 $left = merge_sort($left);17 $right = merge_sort($right);18 19 $output = merge($left,$right);20 21 return $output;22 23 }24 25 26 function merge($left,$right)27 {28 $result = array();29 30 while(count($left) >0 && count($right) > 0)31 {32 if($left[0] <= $right[0]){33 array_push($result,array_shift($left));34 }else{35 array_push($result,array_shift($right));36 }37 }38 39 array_splice($result,count($result),0,$left);40 array_splice($result,count($result),0,$right);41 42 return $result;43 44 45 46 }47 48 49 $output = merge_sort($input);50 echo "<pre>";51 print_r($output);52 echo "</pre>"53 ?>