归并排序核心思想是“分而治之”,它的思路是这样的:要实现一个序列的排序,先实现左半个序列的排序,再实现右半个序列的排序,最后把这两个排好序的半个序列合并在一起。


// 实现序列合并
static private function _merge(&$arr,$start,$mid,$end){
    if($mid<=$start || $end<=$mid){
        return;
    }
    $temp = [];
    $len1 = $mid - $start;
    $len2 = $end - $mid;
    $index1 = 0;
    $index2 = 0;
    while ($index1<$len1 && $index2<$len2) {
        if($arr[$start+$index1]<=$arr[$mid+$index2]){
            $temp[] = $arr[$start+$index1];
            $index1++;

        }else{
            $temp[] = $arr[$mid+$index2];
            $index2++;
        }
    }
    while ($index1<$len1) {
        $temp[] = $arr[$start+$index1];
        $index1++;
    }
    while ($index2<$len2) {
        $temp[] = $arr[$mid+$index2];
        $index2++;
    }
    $len = count($temp);
    for($i=0;$i<$len;$i++){
        $arr[$start+$i] = $temp[$i];
    }        

}

static public function mergeSort(&$arr,$from=0,$to=NULL){
    if(!is_array($arr)){
        return false;
    }
    if($to===NULL){
        $to = count($arr) - 1;
    }
    $len = $to - $from;
    // 递归退出条件
    if($len<1){
        return false;
    }
    $mid = floor(($to+$from)/2);
    self::mergeSort($arr,$from,$mid);
    self::mergeSort($arr,$mid+1,$to);

    self::_merge($arr,$from,$mid+1,$to+1);
    return true;
}

这种算法时间复杂度为O(nlogn)。

results matching ""

    No results matching ""