PHP常用算法和数据结构示例(必看篇)


Posted in PHP onMarch 15, 2017

实例如下:

</pre><pre name="code" class="php"><?php
/**
 * Created by PhpStorm.
 * User: qishou
 * Date: 15-8-2
 * Time: 上午9:12
 */
header("content-type:text/html;charset=utf-8");
$arr = array(3,5,8,4,9,6,1,7,2);
echo implode(" ",$arr)."<br/>";
//---------------------------------------
//       常用排序算法
//---------------------------------------
//冒泡排序
function BubbleSort($arr){
  $length = count($arr);
  if($length<=1){
    return $arr;
  }
  for($i=0;$i<$length;$i++){
    for($j=$length-1;$j>$i;$j--){
      if($arr[$j]<$arr[$j-1]){
        $tmp = $arr[$j];
        $arr[$j] = $arr[$j-1];
        $arr[$j-1] = $tmp;
      }
    }
  }
  return $arr;
}
echo '冒泡排序:';
echo implode(' ',BubbleSort($arr))."<br/>";

//快速排序
function QSort($arr){
  $length = count($arr);
  if($length <=1){
    return $arr;
  }
  $pivot = $arr[0];//枢轴
  $left_arr = array();
  $right_arr = array();
  for($i=1;$i<$length;$i++){//注意$i从1开始0是枢轴
    if($arr[$i]<=$pivot){
      $left_arr[] = $arr[$i];
    }else{
      $right_arr[] = $arr[$i];
    }
  }
  $left_arr = QSort($left_arr);//递归排序左半部分
  $right_arr = QSort($right_arr);//递归排序右半部份
  return array_merge($left_arr,array($pivot),$right_arr);//合并左半部分、枢轴、右半部分
}
echo "快速排序:";
echo implode(' ',QSort($arr))."<br/>";

//选择排序(不稳定)
function SelectSort($arr){
  $length = count($arr);
  if($length<=1){
    return $arr;
  }
  for($i=0;$i<$length;$i++){
    $min = $i;
    for($j=$i+1;$j<$length;$j++){
      if($arr[$j]<$arr[$min]){
        $min = $j;
      }
    }
    if($i != $min){
      $tmp = $arr[$i];
      $arr[$i] = $arr[$min];
      $arr[$min] = $tmp;
    }
  }
  return $arr;
}
echo "选择排序:";
echo implode(' ',SelectSort($arr))."<br/>";

//插入排序
function InsertSort($arr){
  $length = count($arr);
  if($length <=1){
    return $arr;
  }
  for($i=1;$i<$length;$i++){
    $x = $arr[$i];
    $j = $i-1;
    while($x<$arr[$j] && $j>=0){
      $arr[$j+1] = $arr[$j];
      $j--;
    }
    $arr[$j+1] = $x;
  }
  return $arr;
}
echo '插入排序:';
echo implode(' ',InsertSort($arr))."<br/>";
//---------------------------------------
//       常用查找算法
//---------------------------------------
//二分查找
function binary_search($arr,$low,$high,$key){
  while($low<=$high){
    $mid = intval(($low+$high)/2);
    if($key == $arr[$mid]){
      return $mid+1;
    }elseif($key<$arr[$mid]){
      $high = $mid-1;
    }elseif($key>$arr[$mid]){
      $low = $mid+1;
    }
  }
  return -1;
}
$key = 6;
echo "二分查找{$key}的位置:";
echo binary_search(QSort($arr),0,8,$key);

//顺序查找
function SqSearch($arr,$key){
  $length = count($arr);
  for($i=0;$i<$length;$i++){
    if($key == $arr[$i]){
      return $i+1;
    }
  }
  return -1;
}
$key = 8;
echo "<br/>顺序常规查找{$key}的位置:";
echo SqSearch($arr,$key);
//---------------------------------------
//       常用数据结构
//---------------------------------------
//线性表的删除(数组实现)
function delete_array_element($arr,$pos){
  $length = count($arr);
  if($pos<1 || $pos>$length){
    return "删除位置出错!";
  }
  for($i=$pos-1;$i<$length-1;$i++){
    $arr[$i] = $arr[$i+1];
  }
  array_pop($arr);
  return $arr;
}
$pos = 3;
echo "<br/>除第{$pos}位置上的元素后:";
echo implode(' ',delete_array_element($arr,$pos))."<br/>";

/**
 * Class Node
 * PHP模拟链表的基本操作
 */
class Node{
  public $data = '';
  public $next = null;
}
//初始化
function init($linkList){
  $linkList->data = 0; //用来记录链表长度
  $linkList->next = null;
}
//头插法创建链表
function createHead(&$linkList,$length){
  for($i=0;$i<$length;$i++){
    $newNode = new Node();
    $newNode->data = $i;
    $newNode->next = $linkList->next;//因为PHP中对象本身就是引用所以不用再可用“&”
    $linkList->next = $newNode;
    $linkList->data++;
  }
}
//尾插法创建链表
function createTail(&$linkList,$length){
  $r = $linkList;
  for($i=0;$i<$length;$i++){
    $newNode = new Node();
    $newNode->data = $i;
    $newNode->next = $r->next;
    $r->next = $newNode;
    $r = $newNode;
    $linkList->data++;
  }
}
//在指定位置插入指定元素
function insert($linkList,$pos,$elem){
  if($pos<1 && $pos>$linkList->data+1){
    echo "插入位置错误!";
  }
  $p = $linkList;
  for($i=1;$i<$pos;$i++){
    $p = $p->next;
  }
  $newNode = new Node();
  $newNode->data = $elem;
  $newNode->next = $p->next;
  $p->next = $newNode;
}
//删除指定位置的元素
function delete($linkList,$pos){
  if($pos<1 && $pos>$linkList->data+1){
    echo "位置不存在!";
  }
  $p = $linkList;
  for($i=1;$i<$pos;$i++){
    $p = $p->next;
  }
  $q = $p->next;
  $p->next = $q->next;
  unset($q);
  $linkList->data--;
}
//输出链表数据
function show($linkList){
  $p = $linkList->next;
  while($p!=null){
    echo $p->data." ";
    $p = $p->next;
  }
  echo '<br/>';
}

$linkList = new Node();
init($linkList);//初始化
createTail($linkList,10);//尾插法创建链表
show($linkList);//打印出链表
insert($linkList,3,'a');//插入
show($linkList);
delete($linkList,3);//删除
show($linkList);

/**
 * Class Stack
 * 用PHP模拟顺序栈的基本操作
 */
class Stack{
  //用默认值直接初始化栈了,也可用构造方法初始化栈
  private $top = -1;
  private $maxSize = 5;
  private $stack = array();

  //入栈
  public function push($elem){
    if($this->top >= $this->maxSize-1){
      echo "栈已满!<br/>";
      return;
    }
    $this->top++;
    $this->stack[$this->top] = $elem;
  }
  //出栈
  public function pop(){
    if($this->top == -1){
      echo "栈是空的!";
      return ;
    }
    $elem = $this->stack[$this->top];
    unset($this->stack[$this->top]);
    $this->top--;
    return $elem;
  }
  //打印栈
  public function show(){
    for($i=$this->top;$i>=0;$i--){
      echo $this->stack[$i]." ";
    }
    echo "<br/>";
  }
}

$stack = new Stack();
$stack->push(3);
$stack->push(5);
$stack->push(8);
$stack->push(7);
$stack->push(9);
$stack->push(2);
$stack->show();
$stack->pop();
$stack->pop();
$stack->pop();
$stack->show();

/**
 * Class Deque
 * 使用PHP实现双向队列
 */
class Deque{
  private $queue = array();
  public function addFirst($item){//头入队
    array_unshift($this->queue,$item);
  }
  public function addLast($item){//尾入队
    array_push($this->queue,$item);
  }
  public function removeFirst(){//头出队
    array_shift($this->queue);
  }
  public function removeLast(){//尾出队
    array_pop($this->queue);
  }
  public function show(){//打印
    foreach($this->queue as $item){
      echo $item." ";
    }
    echo "<br/>";
  }
}
$deque = new Deque();
$deque->addFirst(2);
$deque->addLast(3);
$deque->addLast(4);
$deque->addFirst(5);
$deque->show();

//PHP解决约瑟夫环问题
//方法一
function joseph_ring($n,$m){
  $arr = range(1,$n);
  $i = 0;
  while(count($arr)>1){
    $i=$i+1;
    $head = array_shift($arr);
    if($i%$m != 0){ //如果不是则重新压入数组
      array_push($arr,$head);
    }
  }
  return $arr[0];
}
//方法二
function joseph_ring2($n,$m){
  $r = 0;
  for($i=2;$i<=$n;$i++){
    $r = ($r+$m)%$i;
  }
  return $r + 1;
}
echo "<br/>".joseph_ring(60,5)."<br/>";
echo "<br/>".joseph_ring2(60,5)."<br/>";

以上这篇PHP常用算法和数据结构示例(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
记录mysql性能查询过程的使用方法
May 02 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
PHP编程 SSO详细介绍及简单实例
Jan 13 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
Jan 29 PHP
PHP单例模式模拟Java Bean实现方法示例
Dec 07 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
Mar 15 #PHP
wordpress网站转移到本地运行测试的方法
Mar 15 #PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
Mar 15 #PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 #PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
Mar 15 #PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 #PHP
thinkPHP简单调用函数与类库的方法
Mar 15 #PHP
You might like
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php阳历转农历优化版
2016/08/08 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
Web打印解决方案之普通报表打印功能
2016/08/29 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
Python实现最常见加密方式详解
2019/07/13 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
毕业求职自荐信格式是什么
2013/11/19 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
大学生村官承诺书
2014/03/28 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
心得体会的写法
2014/09/05 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
小浪底导游词
2015/02/12 职场文书
以权谋私检举信范文
2015/03/02 职场文书
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏