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 ...
随机推荐
- 行为类模式(一):职责链(Chain Of Responsibility)
定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. UML 优点 将请求的发送者和接收者解耦 可以 ...
- Redis本地环境搭建
Windows 下环境搭建 1. 设置hosts set duapphosts=127.0.0.1 sqld.duapp.com set redisduapphosts=127.0.0.1 redis ...
- 无责任Windows Azure SDK .NET开发入门篇三[使用Azure AD 管理用户信息--3.3 Details用户详细信息]
3.3 Details用户详细信息 用户详细信息是通过objectId获取.代码如下 public async Task<ActionResult> Details(string obje ...
- 用jquery判断当前显示器的分辨率,加载不同CSS
<link rel="stylesheet" type="text/css" id="css"><script langu ...
- Extjs Google的Suggest的自动提示 从后台取数据
//服务器取数据 var remoteStore = Ext.create('Ext.data.Store', { proxy: ({ type: "ajax", url:&quo ...
- iOS 3DES DES AES加密注意事项!!很重要,否则会加密失败
今天做项目,需要进行3des加密. 加密的gkey:abcdefgh giv:(偏移量)abcdefgh 加密后结果:p+X985x5bFS6dWjAnm6sdQ== 下面是代码: +(NSStr ...
- IIS配置(安装IIS、.Net、更改IIS Log目录位置)
#安装IIS..NetFramework 3.5 Import-Module servermanager Get-WindowsFeature web-* | ? {$_.Name -ne " ...
- 模块化JavaScript设计模式(一)
在可扩展JavaScript的世界里,假设我们说一个应用程序是模块化(modular)的,那么通常意味着它是由一系列存储于模块中的高度解耦,不同的功能片段组成. 在可能的情况下.通过一处依赖性.松耦合 ...
- Spring Mvc返回html页面404错误解决记录--转载
原文地址:http://53873039oycg.iteye.com/blog/2061992 以前使用Spring Mvc时候都是返回jsp页面或者ftl页面,昨天想返回html页面,spring- ...
- 关于测试Windows电脑端口的命令 —— telnet用法
telnet服务在win7默认是打开的,如果没有打开要在电脑中打开. 命令格式:telnet ip port 例如:telnet 127.0.0.1 80 或者 telnet www.XXX.com ...