归并排序的百度百科,有各种语言的写法。我刚查到的时候,感觉php的写法,有些过于简洁,不是很好理解,而且还拆分成两个方法。
故,在此根据自己的理解,重新写了一遍易读的流程。
闲话少说,直接上代码:
/**
* 归并排序,详细流程
*/
function guibing_sort($arrData){
$len = count($arrData);//获取数组长度
if($len <= 1){
return $arrData;//元素太少,不用排序
}
$mid = intval($len/2);//取数组中间
$arrLeft = array_slice($arrData, 0, $mid);
$arrRight = array_slice($arrData, $mid);
$arrLeft = guibing_sort($arrLeft);//递归获取排序后的左侧数组
$arrRight = guibing_sort($arrRight);//递归获取排序后的右侧数组
//对两侧数据进行合并排序
$arrResult = [];
$intLenLeft = count($arrLeft);
$intLenRight = count($arrRight);
while($intLenLeft > 0 && $intLenRight > 0){
//每次取两个数组第一个元素,进行比较
if($arrLeft[0] < $arrRight[0]){
$arrResult[] = $arrLeft[0];
array_shift($arrLeft);//删除这个元素
$intLenLeft--;//左侧数组长度减一
}else{
$arrResult[] = $arrRight[0];
array_shift($arrRight);//删除这个元素
$intLenRight--;//右侧数组长度减一
}
}
//将剩下的数组元素,追加到结果集后面
if($intLenLeft > 0){
$arrResult = array_merge($arrResult, $arrLeft);
}else{
$arrResult = array_merge($arrResult, $arrRight);
}
return $arrResult;
}
/**
* 调用
*/
$arrData = [28,7,39,28,98,347,74,60,47];
$arrSort = guibing_sort($arrData);
echo "<pre>";
print_r($arrSort);