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 ...
随机推荐
- ELF学习--装载过程
当我们在linux bash下执行ELF程序时,Linux系统是怎样装载和执行的呢? 1.bash进程fork出子进程 2.在bash的子进程中调用execve系统调用来执行指定的ELF. 3.exe ...
- cocos2dx使用TiledMap创建斜45度地图场景
做游戏,场景是一个很重要的部分,如果缺少这一步,很难做出好的游戏,对于cocos2dx来说,有很多2D的地图编辑器可以用,效果都还可以,其中Tiled是支持的比较好的,它支持Tiled编辑出来的几种模 ...
- DELPHI下读取与设置系统时钟
在DELPHI下读取与设置系统时钟 很多朋友都想在自己的程序中显示系统时间 这在DELPHI中十分容易 利用DateToStr(Date)及TimeToStr(Time)函数即可实现. 二者的函数原型 ...
- css margin的相关属性,问题及应用
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=48 引言:margin ...
- Winform学习手册(目录)
一.基础: WINFORM学习笔记——创建Winform项目 WINFORM学习手册——TextBox.Lable.Button WINFORM学习笔记——窗体生命周期 WINFORM学习手册——对话 ...
- Java学习笔记之深入理解引用
引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解 ...
- CodeForces 173A Rock-Paper-Scissors 数学
Rock-Paper-Scissors 题目连接: http://codeforces.com/problemset/problem/173/A Description Nikephoros and ...
- jQuery 属性操作 - addClass() 方法
使用 addClass() 和 removeClass() 来移除 class,并添加新的 class. <html> <head> <script type=" ...
- android自定义TabWidget样式
先看看效果图吧,个人觉得图标丑了点,不过还行,自己用PS做的 下面是全部代码和流程,一定要按流程顺序来,不然错误! 1.tabhost.xml <TabHost xmlns:android=&q ...
- 实现顶部轮播,下部listview经典布局的两种方式
开头: 在做android开发的时候,我们经常会遇到这样的布局,上面是一个图片轮播图,下面是一些列表的项目.很多新闻app,视频类app都采用这样的布局.起初的时候 由于没有很多参考,我自己想到了一种 ...