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中str_replace函数使用小结
Oct 11 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
Aug 28 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
php+html5+ajax实现上传图片的方法
May 14 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
PHP使用ActiveMQ实例
Feb 05 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
Terran兵种对照表
2020/03/14 星际争霸
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
php实现文件预览功能
2017/05/23 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
Python运算符重载用法实例
2015/05/28 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python 以16进制打印输出的方法
2018/07/09 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
效能监察建议书
2014/05/19 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
springboot中的pom文件 project报错问题
2022/01/18 Java/Android