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生成xml简单实例代码
Dec 16 PHP
PHP 获取客户端真实IP地址多种方法小结
May 15 PHP
php 代码优化之经典示例
Mar 24 PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 PHP
ucenter通信原理分析
Jan 09 PHP
php计算函数执行时间的方法
Mar 20 PHP
PHP 错误处理机制
Jul 06 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
Mar 21 PHP
php的常量和变量实例详解
Jun 27 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 PHP
Laravel中使用Queue的最基本操作教程
Dec 27 PHP
PHP写API输出的时用echo的原因详解
Apr 28 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获取指定范围内最接近数的方法
2015/06/02 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
php数据访问之增删改查操作
2016/05/09 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
下载糗事百科的内容_python版
2008/12/07 Python
python使用Turtle库绘制动态钟表
2018/11/19 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
python中open函数的基本用法示例
2019/09/07 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
个人教师自我评价范文
2013/12/02 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
招股说明书范本
2014/05/06 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
2014年材料员工作总结
2014/11/19 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
打架检讨书范文
2015/01/27 职场文书
初二物理教学反思
2016/02/19 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
MySQL如何构建数据表索引
2021/05/13 MySQL