PHP版本常用的排序算法汇总


Posted in PHP onDecember 20, 2015

//1、冒泡排序

function bubble_sort($arr){
$n = count($arr);
for($i=0;$i<$n-1;$i++){
for($j=$i+1;;$j<$n-$i;$j++){
if($arr[$j]<$arr[$i]){
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
}

 //2、归并排序

//merge函数将指定的两个有序数组(arr1arr2,)合并并且排序
//我们可以找到第三个数组,然后依次从两个数组的开始取数据哪个数据小就先取哪个的,然后删除掉刚刚取过///的数据
function al_merge($arrA, $arrB)
{
$arrC = array();
while (count($arrA) && count($arrB)) {
//这里不断的判断哪个值小,就将小的值给到arrC,但是到最后肯定要剩下几个值,
//不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值,肯定比arrC里面所有的值都大所以使用
$arrC[] = $arrA['0'] < $arrB['0'] ? array_shift($arrA) : array_shift($arrB);
}
return array_merge($arrC, $arrA, $arrB);
}

//归并排序主程序
function al_merge_sort($arr)
{
$len = count($arr);
if ($len <= 1) {
return $arr; //递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
}
$mid = intval($len / 2); //取数组中间
$left_arr = array_slice($arr, 0, $mid); //拆分数组0-mid这部分给左边left_arr
$right_arr = array_slice($arr, $mid); //拆分数组mid-末尾这部分给右边right_arr
$left_arr = al_merge_sort($left_arr); //左边拆分完后开始递归合并往上走
$right_arr = al_merge_sort($right_arr); //右边拆分完毕开始递归往上走
$arr = al_merge($left_arr, $right_arr); //合并两个数组,继续递归
return $arr;
}

$arr = array(12, 5, 4, 7, 8, 3, 4, 2, 6, 4, 9);
print_r(al_merge_sort($arr));

 //3、二分查找-递归

//二分查找-递归
function bin_search($array,$low,$high,$k){
  if($low <= $high){
    $mid = intval(($low+$high)/2);
  }else{
    return false;
  }
  if($array[$mid] == $k){
    return $mid;
  }elseif($k < $array[$mid]){
    return bin_search($array,$low,$mid-1,$k);
  }else{
    return bin_search($array,$mid+1,$high,$k);
  }
}
$arr = array(12, 5, 4, 7, 3, 8, 4, 2, 6, 4, 9);
$index = bin_search($arr,0,10,12); //直接输出为空,不解
echo(intval($index));

//4、二分查找-非递归

function bin_search($arr,$low,$high,$value) {//$arr 数组; $slow 最小索引; $high 最大索引 $value 查找的值
while($low<=$high) { 
  $mid=intval(($low+$high)/2); 
  if($value==$arr[$mid]){
return $mid; 
}elseif($value<$arr[$mid]){
$high=$mid-1; 
}else{
$low=$mid+1; 
} 
}
return false; 
}

//5、快速排序

function quick_sort($arr) {
  $n=count($arr);
  if($n<=1)
    return $arr;
  $key=$arr[0];
  $left_arr=array();
  $right_arr=array();
  for($i=1;$i<$n;$i++) {
    if($arr[$i]<=$key)
      $left_arr[]=$arr[$i];
    else
      $right_arr[]=$arr[$i];
  }
  $left_arr=quick_sort($left_arr);
  $right_arr=quick_sort($right_arr);
  return array_merge($left_arr,array($key),$right_arr);
}

//6、选择排序

function select_sort($arr) {
  $n=count($arr);
  for($i=0;$i<$n;$i++) {
    $k=$i;
    for($j=$i+1;$j<$n;$j++) {
      if($arr[$j]<$arr[$k])
        $k=$j;
    }
    if($k!=$i) {
      $temp=$arr[$i];
      $arr[$i]=$arr[$k];
      $arr[$k]=$temp;
    }
  }
  return $arr;
}

//7、插入排序

function insertSort($arr) {
  $n=count($arr);
  for($i=1;$i<$n;$i++) {
    $tmp=$arr[$i];
    $j=$i-1;
    while($arr[$j]>$tmp) {
      $arr[$j+1]=$arr[$j];
      $arr[$j]=$tmp;
      $j--;
      if($j<0)
        break;
    }
  }
  return $arr;
}
PHP 相关文章推荐
生成静态页面的PHP类
Jul 15 PHP
php和js交互一例-PHP教程,PHP应用
Jan 03 PHP
PHP insert语法详解
Jun 07 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
linux下php上传文件注意事项
Jun 11 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
浅谈关于PHP解决图片无损压缩的问题
Sep 01 PHP
PHP学习记录之数组函数
Jun 01 PHP
php二维数组按某个键值排序的实例讲解
Feb 15 PHP
php中try catch捕获异常实例详解
Aug 06 PHP
php封装好的人民币数值转中文大写类
Dec 20 #PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 #PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 #PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
Dec 19 #PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 #PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 #PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 #PHP
You might like
php中随机显示图片的函数代码
2011/06/23 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
jquery 单击li防止重复加载的实现代码
2010/12/24 Javascript
基于jquery循环map功能的代码
2011/02/26 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
python 中文乱码问题深入分析
2011/03/13 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python探索之自定义实现线程池
2017/10/27 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
会计实习生自我鉴定
2013/12/12 职场文书
采购部部长岗位职责
2014/02/06 职场文书
事业单位考核材料
2014/05/21 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
创业计划书之美甲店
2019/09/20 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python