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 相关文章推荐
实用函数2
Nov 08 PHP
PHP中$_SERVER的详细参数与说明
Jul 29 PHP
PHP中如何定义和使用常量
Feb 28 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
PHP中overload与override的区别
Feb 13 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
Jun 07 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 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里得到前天和昨天的日期的代码
2007/08/16 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
layui表格数据重载
2019/07/27 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
python中正则表达式与模式匹配
2019/05/07 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
浅析CSS3 用text-overflow解决文字排版问题
2020/10/28 HTML / CSS
中国电视购物:快乐购
2017/02/04 全球购物
2014年幼儿园元旦活动方案
2014/02/13 职场文书
北京故宫导游词
2015/01/31 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript
Python 数据科学 Matplotlib图库详解
2021/07/07 Python
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL