原理:将原来的序列,拆分为单个的小序列(整个数组未改变,只是指针指向下标)
<?php
//交换函数(没用到)
function swap(array &$arr,$a,$b){
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
//归并算法总函数
function MergeSort(array &$arr){
$start = 0;
$end = count($arr) - 1;
MSort($arr,$start,$end);
}
//主函数
//MSort() 函数实现将数组分半再分半(直到子序列长度为1),然后将子序列合并起来。(递归)
function MSort(array &$arr,$start,$end){
//当子序列长度为1时,$start == $end,不用再分组
if($start < $end){
$mid = floor(($start + $end) / 2); //将 $arr 平分为 $arr[$start - $mid] 和 $arr[$mid+1 - $end]
MSort($arr,$start,$mid); //将 $arr[$start - $mid] 归并为有序的$arr[$start - $mid]
MSort($arr,$mid + 1,$end); //将 $arr[$mid+1 - $end] 归并为有序的 $arr[$mid+1 - $end]
// 两拨排好序的序列
Merge($arr,$start,$mid,$end); //将$arr[$start - $mid]部分和$arr[$mid+1 - $end]部分合并起来成为有序的$arr[$start - $end]
}
}
//归并操作函数 Merge()
//归并操作
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,4,6,2);
MergeSort($arr);
var_dump($arr);
// 由于归并算法无论原来的序列是否有序都会进行分组和比较,因此它的最好、最坏、平均的时间复杂度都是 O(nlogn)。
// 归并算法是一种稳定的排序算法。