php实现二路归并排序

 1 $arr = [9, 43, 12, 0, 87, 1];
 2 function merge_sort(&$arr){
 3     _merge_sort($arr, $arr, 0, count($arr) - 1);
 4 }
 5 
 6 function _merge_sort(&$s_arr, &$d_arr, $i, $j){
 7     if($i > $j){
 8         return;
 9     }
10     if($i == $j){
11         echo 'aa';
12         $d_arr[$i] = $s_arr[$i];
13         return false;
14     }
15     $tmp_arr = array();
16     $m = intval(($i + $j)/2);
17     echo $m;
18     if($i <= $m){
19         _merge_sort($s_arr, $tmp_arr, $i, $m);
20     }
21     if($m+1 <= $j ){
22         _merge_sort($s_arr, $tmp_arr, $m+1, $j);
23     }
24     merge($tmp_arr, $d_arr, $i, $m, $j);
25 }
26 //$s_arr中的$start到$m与$m到$end两个序列都是有序的,将这两个序列合并到$d_arr里面
27 function merge(&$s_arr, &$d_arr, $start, $m, $end){
28     $i = $start; $j = $m+1;$d_i = $i;
29     while($i <= $m && $j <= $end){
30         if($s_arr[$i] > $s_arr[$j]){
31             $d_arr[$d_i++] = $s_arr[$i++];
32             //$i++;
33         }else{
34             $d_arr[$d_i++] = $s_arr[$j++];
35         }
36     }
37     while($i <= $m){
38         $d_arr[$d_i++] = $s_arr[$i++];
39         //$i++;
40     }
41     while ($j <= $end) {
42         $d_arr[$d_i++] = $s_arr[$j++];
43     }
44 }

 

 

function merge_sort(&$src) {
	$end = count($src) - 1;
	$tmp = array();
	_merge_sort($src, $src, 0, $end);
}
/*
* 将数组$src_arr从序列$s到$e根据里面的值有序的复制到$to_arr
*/
function _merge_sort(&$src_arr, &$to_arr, $s, $e) {
	if ($s > $e) {
		return $to_arr;
	}
	if ($s == $e) {
		$to_arr[$s] = $src_arr[$s];
		return $to_arr;
	}
	$m = ceil( ($s + $e)/2 );
	$tmp_arr = array();
	//将数组$src_arr分别从$s到$m - 1,从$m到$e有序的复制到$tmp_arr中
	if ($s < $m) {
		_merge_sort($src_arr, $tmp_arr, $s, $m - 1);
	}
	if ( $e >= $m ) {
		_merge_sort($src_arr, $tmp_arr, $m, $e);
	}
	//
	merge($tmp_arr, $to_arr, $s, $m, $e);
}

/*
* $src_arr从$s到$m与从$m到$e分别是一个从小到大的数组
* 现将这样这样两个有序的数组合并为一个有序的数组$to_arr
*/
function merge(&$src_arr, &$to_arr, $s, $m, $e) {
	$j = $m;
	$to_i = $s;
	while ($s < $m && $j <= $e) {
		if ($src_arr[$s] < $src_arr[$j]) {
			$to_arr[$to_i++] = $src_arr[$s++];
		} else {
			$to_arr[$to_i++] = $src_arr[$j++];
		}
	}

	while ($s < $m) {
		$to_arr[$to_i++] = $src_arr[$s++];
	}

	while ($j <= $e) {
		$to_arr[$to_i++] = $src_arr[$j++];
	}
	return $to_arr;
}

  

 

转载于:https://www.cnblogs.com/fengfengtk/p/5452716.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值