php实现归并排序

1.概念

归并排序是建立在归并操作上的一种有效的排序算法,该算法是分治法的一个典型应用。将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,在使子序列段间有序。若将两个有序表合并为一个有序表,称为二路归并。

2.图解


如图,从下往上,每一步都需将两个已经有序的子序列合并成一个大的有序数组

3.代码实现

//合并两个有序数组
function merge(&$arr, $low, $mid, $high){
    $temp = $arr;   //生成一个临时数组,和原数组一模一样,方便后面的比较
    $i = $low;
    $j = $mid+1;
    while ($low<=$mid && $j<=$high) {
        if ($temp[$low]>$temp[$j]) {
            $arr[$i++] = $temp[$j++];
        }else {
            $arr[$i++] = $temp[$low++];
        }
    }
    //剩下其中一个数组的情况
    while ($low<=$mid) {
        $arr[$i++] = $temp[$low++];
    }
    //剩下另一个数组的情况
    while ($j<=$high) {
        $arr[$i++] = $temp[$j++];
    }
    unset($temp);   //释放临时数组
}
//递归调用
function merge_sort(&$arr,$low,$high) {
    if ($low>=$high) return;    //结束条件
    $mid = (int)(($low+$high)/2);
    merge_sort($arr,$low,$mid);
    merge_sort($arr,$mid+1,$high);
    merge($arr,$low,$mid,$high);
}
$arr = [12,56,98,32,16,34,2,9,1];
$len = count($arr);
merge_sort($arr, 0, $len-1);
dump($arr);

4.效果展示


5.复杂度分析

归并排序的时间复杂度为 O(nlogn),空间复杂度为 O(n)。但是它是稳定的排序算法,因为两两的归并,它们之间是基于相邻元素之间的比较。

猜你喜欢

转载自blog.csdn.net/u013252047/article/details/79247703