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 相关文章推荐
多重?l件?合查?(二)
Oct 09 PHP
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Oct 11 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
Jun 01 PHP
php使用GeoIP库实例
Jun 27 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
使用PHP免费发送定时短信的实例
Oct 24 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
Feb 17 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 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学习笔记(毕业设计)
2012/02/21 PHP
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
PHP图片加水印实现方法
2016/05/06 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
推荐一款jQuery插件模板
2015/01/09 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
Algenist奥杰尼官网:微藻抗衰老护肤品牌
2017/07/15 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
WSDL的操作类型主要有几种
2013/07/19 面试题
参观监狱心得体会
2014/01/02 职场文书
创业大赛策划书
2014/03/01 职场文书
医院党员公开承诺书
2014/08/30 职场文书
工作证明格式范文
2015/06/15 职场文书
家电创业计划书
2019/08/05 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
关于JavaScript轮播图的实现
2021/11/20 Javascript