PHP实现归并排序

来源:互联网 发布:电脑报淘宝生活馆 编辑:程序博客网 时间:2024/06/07 15:13

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。时间复杂度是 O(nlogn),空间复杂度O(n)。

//归并算法总函数function MergeSort(array &$arr){    $start = 0;    $end = count($arr) - 1;    MSort($arr, $start, $end);}// 将数组分半再分半(直到子序列长度为1),然后将子序列合并起来。function MSort(array &$arr, $start, $end){    //当子序列长度为1时,$start == $end,不用再分组    if($start < $end){        $mid = $start + (($end - $start)>>1); MSort($arr, $start, $mid); MSort($arr, $mid + 1, $end);         Merge($arr, $start, $mid, $end);          }}//归并操作function Merge(array &$arr, $start, $mid, $end){    $i = $start;    $j=$mid + 1;    $k = $start;    $temparr = array();    while($i != $mid+1 && $j != $end+1)    {       if($arr[$i] >= $arr[$j]){           $temparr[$k++] = $arr[$j++];       }       else{           $temparr[$k++] = $arr[$i++];       }    }    //将第一个子序列的剩余部分添加到已经排好序的 $temparr 数组中    while($i != $mid+1){        $temparr[$k++] = $arr[$i++];    }    //将第二个子序列的剩余部分添加到已经排好序的 $temparr 数组中    while($j != $end+1){        $temparr[$k++] = $arr[$j++];    }    for($i=$start; $i <= $end; $i++){        $arr[$i] = $temparr[$i];    }}$arr = array(9,1,5,8,3,7,45,6,2);MergeSort($arr);print_r($arr);
优化一:

function MSort(array &$arr, $start, $end){    //当子序列长度为1时,$start == $end,不用再分组    if($start < $end){        $mid = $start + (($end - $start)>>1); MSort($arr, $start, $mid); MSort($arr, $mid + 1, $end);//两边的子序列都是有序的,如果左边的最大的元素比右边最小的元素大才需要合并 if ($arr[$mid] > $arr[$mid+1]) {Merge($arr, $start, $mid, $end);   }                }}
优化二:

可以在Msort()里面加上以下的代码

//子序列长度小的时候可以调用插入排序,不用再二分序列和归并

if($end - $start<= 20) {

          InsertSort($arr,$start, $end);

}





原创粉丝点击