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下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
Oct 08 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
Oct 18 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
Oct 29 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
Nov 14 PHP
PHP实现添加购物车功能
Mar 06 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
Mar 18 PHP
php tpl模板引擎定义与使用示例
Aug 09 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
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 在线打包_支持子目录
2008/06/28 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
深入PHP变量存储的详解
2013/06/13 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Python模块相关知识点小结
2020/03/09 Python
django 实现简单的插入视频
2020/04/07 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
C有"按引用传递"吗
2016/09/06 面试题
师范生教师实习自我鉴定
2013/09/27 职场文书
大四自我鉴定范文
2013/10/06 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
工作会议方案
2014/05/21 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
中秋节祝酒词
2015/08/12 职场文书
初中班主任工作随笔
2015/08/15 职场文书
怎么用Python识别手势数字
2021/06/07 Python
vue打包时去掉所有的console.log
2022/04/10 Vue.js