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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
PHP 日期加减的类,很不错
Oct 10 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
PHP 过滤页面中的BOM(实现代码)
Jun 29 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
PHP利用APC模块实现大文件上传进度条的方法
Oct 29 PHP
Json_encode防止汉字转义成unicode的方法
Feb 25 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
PHP反射API示例分享
Oct 08 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 PHP
PHP执行普通shell命令流程解析
Aug 24 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 Smarty 字符比较代码
2011/02/27 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
python操作MongoDB基础知识
2013/11/01 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python中异常重试的解决方案详解
2017/05/05 Python
Python自定义线程池实现方法分析
2018/02/07 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
网络技术支持面试题
2013/04/22 面试题
医院护士专业个人的求职信
2013/12/09 职场文书
教师开学感言
2014/02/14 职场文书
财政专业求职信范文
2014/02/19 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
空中乘务员岗位职责
2014/03/08 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
党员转正意见怎么写
2015/06/03 职场文书