首页 > 代码库 > 算法之-归并排序算法

算法之-归并排序算法

归并排序是效率还是比较高的算法。其中的分治法是常用的一种解决问题的方法,现在流行的云计算其实就是一种分治法的应用。

所谓的分治法,字面解释就是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个思想在实际工作中的作用非常大,特别是处理大数据和做复杂运算的时候。

归并排序的基础是归并操作merge,即将两个有序数组合并为一个有序数组。

归并排序的算法思路为:
第一次扫描数组,将数组中相邻的两个元素merge为有序数组
第二次扫描,将相邻的有序数组再合并为更大的一个有序数组
再进行n次扫描,不断合并数组,直到排序完成

其中的归并操作merge的思路是:
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

好了我们按照上面的思路来用PHP实现归并排序算法:

<?php
//归并排序算法
//首先定义归并操作merge函数
function merge($arr1,$arr2){
   $arr3=array();
   while(!empty($arr1) && !empty($arr2)){
       $arr3[]=$arr1[0]<=$arr2[0]?array_shift($arr1):array_shift($arr2);
   }
   $arr3=array_merge($arr3,$arr1,$arr2);
   return $arr3;
}

//归并排序
function merge_sort($newarray){
    if(count($newarray)<=1) return $newarray;
    $middle=intval(count($newarray)/2);
    $arr1=array_slice($newarray, 0,$middle);
    $arr2=array_slice($newarray, $middle);
    return merge(merge_sort($arr1), merge_sort($arr2));    
}

$arr = array(9,8,7,6,5,8,7);
print_r( merge_sort($arr));

越来越发现递归算法的重要性,熟练应用递归可以解决很多实际的问题。

关于递归的理论可以参考http://www.cnsecer.com/4146.html

算法之-归并排序算法