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 采集心得技巧
May 15 PHP
PHP PDO函数库详解
Apr 27 PHP
php短域名转换为实际域名函数
Jan 17 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
解析PHP对现有搜索引擎的调用
Jun 25 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
php进行ip地址掩码运算处理的方法
Jul 11 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 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数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
JS 控件事件小结
2012/10/31 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
python获取中文字符串长度的方法
2018/11/14 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
C#软件工程师英语面试题
2015/06/07 面试题
会计专业毕业生推荐信
2013/11/05 职场文书
小学语文教学反思
2014/02/10 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
中学生打架检讨书之500字
2019/08/06 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL