php实现二路归并排序
$arr = [9, 43, 12, 0, 87, 1];
function merge_sort(&$arr){
_merge_sort($arr, $arr, 0, count($arr) - 1);
} function _merge_sort(&$s_arr, &$d_arr, $i, $j){
if($i > $j){
return;
}
if($i == $j){
echo 'aa';
$d_arr[$i] = $s_arr[$i];
return false;
}
$tmp_arr = array();
$m = intval(($i + $j)/2);
echo $m;
if($i <= $m){
_merge_sort($s_arr, $tmp_arr, $i, $m);
}
if($m+1 <= $j ){
_merge_sort($s_arr, $tmp_arr, $m+1, $j);
}
merge($tmp_arr, $d_arr, $i, $m, $j);
}
//$s_arr中的$start到$m与$m到$end两个序列都是有序的,将这两个序列合并到$d_arr里面
function merge(&$s_arr, &$d_arr, $start, $m, $end){
$i = $start; $j = $m+1;$d_i = $i;
while($i <= $m && $j <= $end){
if($s_arr[$i] > $s_arr[$j]){
$d_arr[$d_i++] = $s_arr[$i++];
//$i++;
}else{
$d_arr[$d_i++] = $s_arr[$j++];
}
}
while($i <= $m){
$d_arr[$d_i++] = $s_arr[$i++];
//$i++;
}
while ($j <= $end) {
$d_arr[$d_i++] = $s_arr[$j++];
}
}
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;
}
php实现二路归并排序的更多相关文章
- 二路归并排序java实现
		
二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...
 - 二路归并排序算法实现-完整C语言程序
		
/*********************************************************************************************** 1.设 ...
 - 二路归并排序的java实现
		
转载请注明出处 http://www.cnblogs.com/dongxiao-yang/p/6410775.html 参考引言:在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之 ...
 - 递归迭代vector三种方法实现二路归并排序
		
https://mp.csdn.net/mdeditor/84933084# 附链接
 - 二路归并排序,利用递归,时间复杂度o(nlgn)
		
public class MergeSort { public void mergeSort(int[]data, int left, int right) { if(left >= right ...
 - MergeSort(归并排序)算法Java实现
		
归并排序 归并排序 (merge sort) 是一类与插入排序.交换排序.选择排序不同的另一种排序方法.归并的含义是将两个或两个以上的有序表合并成一个新的有序表.归并排序有多路归并排序.两路归并排序 ...
 - 归并排序算法(C#实现)
		
归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件.归并排序有两种方式:1): 自底向上的方法 2):自顶向下的方法 ...
 - 归并排序(Java)
		
选择排序的升级版本归并排序, 归并排序有二路归并,三路归并和多路归并,我这次只分析下二路归并,有机会在分析下别的. 归并排序的思想是这样的: 设数组a中存放了n个数据元素,初始时我们把它们看成是n个长 ...
 - 归并排序—Java版
		
一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...
 
随机推荐
- MyArrayList——实现自己的ArrayList!
			
注:转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5965205.html ArrayList是我们常用的集合类之一,其实它的实现机制很简单,底层还是使用了一个 ...
 - heritrix启动问题修正
			
今天抽时间想看看其他蜘蛛的情况,于是下载了heritrix-1.14.2.搜索了一下相关的安装介绍.基本步骤如下: (1)解压下载的heritrix-1.14.2.zip的压缩包,如将其放在E:\da ...
 - Unity3d:megaFierstext(翻书效果插件)
			
附件中是一款翻书效果插件,由于附件上传大小限制,在下载完后,需要在megaFierstext_BHYF\Assets\Resources\Textures下添加图片精灵并修改属性为Texture,即可 ...
 - 【转】android出现注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注
			
使用Android studio打包应用程序出现如下错误: 注: 某些输入文件使用或覆盖了已过时的 API. 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译. 注: 某些 ...
 - C# ASP.NET Webservice调用外部exe无效的解决方法
			
最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决 ...
 - 使用 preferredStatusBarStyle 设置状态栏颜色
			
iOS9之前,在plist文件中 插入一个新的key,名字为View controller-based status bar appearance,并将其值设置为NO. 然后敲入代码: [UIAppl ...
 - acdream 1409 Musical 状压DP
			
链接:http://acdream.info/problem? pid=1409 题意:整个国家有n座城市,每座城市有三种粉丝. 第一种一周看一场音乐剧,挑选的音乐剧是已经在周围城市播放上演过的次数最 ...
 - Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)
			
Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...
 - C++ 方法隐藏
			
1.过载:一个类中,方法名相同,形参表不同的方法. 2.重写:子类与父类的virtual方法,方法名,形参表相同. 3.考虑下面的情况,子类与父类方法名相同. 父类是virtual方法 ...
 - C# OpenFileDialog和PictrueBox
			
 string resultFile = ""; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFile ...