<?php

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/>";

/*

杨辉三角

*/

class T{

private $num;

public function __construct($var=10) {

if ($var<3) die("值太小啦!");

$this->num=$var;

}

public function display(){

$n=$this->num;

$arr=array();

//$arr=array_fill(0,$n+1,array_fill(0,$n+1,0));

$arr[1]=array_fill(0,3,0);

$arr[1][1]=1;

echo str_pad("&nbsp;",$n*12,"&nbsp;");

printf("%3d",$arr[1][1]);

echo "<br/>";

for($i=2;$i<=$n;$i++){

$arr[$i]=array_fill(0,($i+2),0);

for($j=1;$j<=$i;$j++){

if($j==1)

echo str_pad("&nbsp;",($n+1-$i)*12,"&nbsp;");

printf("%3d",$arr[$i][$j]=$arr[$i-1][$j-1]+$arr[$i-1][$j]);

echo "&nbsp;&nbsp;";

}

echo"<br/>";

}

}

}

$yh=new T(); //$yh=new T(数量);

$yh->display();

//斐波那契递归法

function aa($n){

if($n==0||$n==1){return 1;}

else{

return aa($n-1)+aa($n-2);

}

}

echo aa(30);

echo  "".'<br>';

//斐波那契非递归

function test($num){

$arr=[];

for($i=0;$i<=$num;$i++)

{

if($i==0 || $i==1){

$arr[$i]=1;

}else{

$arr[$i]=$arr[$i-1]+$arr[$i-2];

}

}

return $arr[$num];

}

print_r(test(30));

?>

php---算法和数据结构的更多相关文章

  1. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  2. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

  3. LeetCode_算法及数据结构覆盖统计

    [输入]共计151道题的算法&数据结构基础数据 (见附录A) [输出-算法]其中有算法记录的共计 97道 ,统计后 结果如下  top3(递归,动态规划,回溯) 递归 动态规划 回溯 BFS ...

  4. JavaScript算法与数据结构知识点记录

    JavaScript算法与数据结构知识点记录 zhanweifu

  5. Linux内核中的算法和数据结构

    算法和数据结构纷繁复杂,但是对于Linux Kernel开发人员来说重点了解Linux内核中使用到的算法和数据结构很有必要. 在一个国外问答平台stackexchange.com的Theoretica ...

  6. Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...

  7. 【算法与数据结构专场】BitMap算法基本操作代码实现

    上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下[算法与数据结构专场]BitMap算法介绍 这篇我们来讲一下BitMap这个数据结构的代码实现. 回顾下数据的存储原理 一个二进制位对 ...

  8. 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)

    温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...

  9. PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类

    一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...

  10. 使用python解决算法和数据结构--使用栈实现进制转换

    可以将10进制数据转换成2进制,8进制,16进制等. 晚上练练算法和数据结构哈. # coding = utf-8 class Stack: def __init__(self): self.item ...

随机推荐

  1. 模块 pillow图像处理

    Pillow概况 PIL是Python的一种图像处理工具. PIL支持大部分的图像格式,高效并强大. 核心库设计用来高速访问基于基于像素的数据存储,给这个通用的图像处理工具提供了坚实的基础. 一.读. ...

  2. ASP.NET Core技术研究-探秘Host主机启动过程

    当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.P ...

  3. SpringCloud入门(八): Zuul 过滤器详解

    Zuul 过滤器 zuul 有四种过滤器类型,分别是: 1.Pre:过滤器在请求被路由之前调用.我们可利用这种过滤器实现身份验证.在集群中选择请求的微服务.记录调试信息等: 2.Routing:过滤器 ...

  4. 改进ls的实现

    一.要求 参见附图,改进你的ls的实现.提交代码运行截图和码云链接 二.步骤 目录 ls 功能:列出目录内容,显示文件信息 ls -l:显示当前工作目录下包含目录及属性详细信息(共7列) 第一列:文件 ...

  5. vuex知识要点梳理

    该内容为个人总结,请勿喷. 欢迎各位大神前来指点.

  6. C 怪兽游戏

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 何老板在玩一款怪兽游戏.游戏虽然简单,何老板仍旧乐此不疲.游戏一开始有N只怪兽,编号1到N.其中第i只怪兽 ...

  7. docker安装Elasticsearch7.6集群并设置密码

    docker安装Elasticsearch7.6集群并设置密码 Elasticsearch从6.8开始, 允许免费用户使用X-Pack的安全功能, 以前安装es都是裸奔.接下来记录配置安全认证的方法. ...

  8. webpack篇

    2017年09月28日 14:08:18 阅读数:4770 https://juejin.im/post/59cb6307f265da064e1f65b9 还是以前一样,有些概念面试可能会考,我都用* ...

  9. 使用Azure Rest API获得Access Token介绍

    背景 本文主要介绍如何获取如何获取Azure Rest API的访问token,所采用的是v2.0版本的Microsoft标识平台,关于1.0和2.0的区别可以参考 https://docs.azur ...

  10. 【php】COOKIE和SESSION

    一. COOKIE(小甜点,小饼干) a) 生活中的实例: i. 大保健的会员卡(记录你的姓名.性别.ID号码.手机号……) ii. 超市的会员卡(记录你的姓名,性别,会员积分) b) PHP当中的实 ...