$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实现二路归并排序的更多相关文章

  1. 二路归并排序java实现

    二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...

  2. 二路归并排序算法实现-完整C语言程序

    /*********************************************************************************************** 1.设 ...

  3. 二路归并排序的java实现

    转载请注明出处 http://www.cnblogs.com/dongxiao-yang/p/6410775.html 参考引言:在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之 ...

  4. 递归迭代vector三种方法实现二路归并排序

    https://mp.csdn.net/mdeditor/84933084# 附链接

  5. 二路归并排序,利用递归,时间复杂度o(nlgn)

    public class MergeSort { public void mergeSort(int[]data, int left, int right) { if(left >= right ...

  6. MergeSort(归并排序)算法Java实现

    归并排序  归并排序 (merge sort) 是一类与插入排序.交换排序.选择排序不同的另一种排序方法.归并的含义是将两个或两个以上的有序表合并成一个新的有序表.归并排序有多路归并排序.两路归并排序 ...

  7. 归并排序算法(C#实现)

    归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件.归并排序有两种方式:1): 自底向上的方法 2):自顶向下的方法 ...

  8. 归并排序(Java)

    选择排序的升级版本归并排序, 归并排序有二路归并,三路归并和多路归并,我这次只分析下二路归并,有机会在分析下别的. 归并排序的思想是这样的: 设数组a中存放了n个数据元素,初始时我们把它们看成是n个长 ...

  9. 归并排序—Java版

    一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...

随机推荐

  1. UI:数据持久化

    数据持久化    参考1  参考2  参考3 什么是数据持久化,就是将文件保存在本地的硬盘中,使得应用程序或者机器重启后可以继续访问以前保留的数据.IOS开发中有许多的数据持久化方案. 如下面五种方案 ...

  2. OC:习题来自平时搜索

    == 第一部分 ==  类变量的@protected ,@private,@public,@package,声明各有什么含义?写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?面向对象的三大特征 ...

  3. KMP算法初探

    [edit by xingoo] kmp算法其实就是一种改进的字符串匹配算法.复杂度可以达到O(n+m),n是参考字符串长度,m是匹配字符串长度. 传统的算法,就是匹配字符串与参考字符串挨个比较,如果 ...

  4. Oracle数据库定时任务配置和日志执行情况查询

    基础配置: /***************************************************************** * * 移动抵扣券快到期推送提醒 * 首次执行 : 2 ...

  5. win10的安装、win10启动盘制作

    需要的材料 win10映像 U盘 UltraISO软件 1.下载对应的win10映像 有64位和32位可选(自己找地方下) 2.下载UltraISO软件 3.准备一只U盘,插入电脑 4.启动Ultra ...

  6. thinkphp 3+ 观后详解 (1)

    最近面试了一些公司,发现自己的对于架构能力的不足,于是决定开始从最基本的代码做起.先看看大牛们怎么架构整个框架的.鉴于国外的框架比较难懂,于是就选择了国内比较流行的thinkphp来进行研究. 下面写 ...

  7. HITAG 1/2/S

    HITAG S -- 3rd generation HITAG™ family Modulation Read/Write Device to Transponder: 100 % ASK and B ...

  8. udt nat traverse

    https://github.com/bakwc/udt-nat-traverse Example of nat traversal using udt library. UDT is a udp b ...

  9. li在IE中底部空行的BUG

    li在IE中底部空行的BUG 但是这次li在IE中底部出现的不是3像素而是一整条空白行,如图:HTML代码: <ul> <li><a href="#" ...

  10. 关于form.submit()不能提交表单的错误原因

    来源:http://www.ido321.com/948.html 直接上代码把: 1: <div id="register"> 2: <h4>会员注冊&l ...