<?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. 关于HashSet与HashMap

    package com.test; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; i ...

  2. supervisor 的使用 (fastcgi管理)

    本文主要介绍 supervisor 对 fastcgi 进程的管理 fastcgi 进程的管理 在php 中,php-fpm 有主进程来管理和维护子进程的数量.但是并不是所有的服务都有类似的主进程来做 ...

  3. 第一个AWK程序的尝试

    为了统计API的访问,需要读取8个G的数据,所以学习了下文本处理神器,AWK.简单实例如下: # 以\t分割的文本 awk -F "\t" ' //获取小时的函数 function ...

  4. 老技术新谈,Java应用监控利器JMX(3)

    各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期我们深入的聊了聊 JMX,把 JMX 的架构了解了七七八八,最后通过代码实战,解决系列疑问,实现远程动态修改应用参 ...

  5. 软件——Hexo-NexT配置个人博客

    一.安装NexT Hexo 安装主题的方式非常简单,只需要将主题文件拷贝至站点目录的 themes 目录下, 然后修改下配置文件即可.具体到 NexT 来说,安装步骤如下. 1.克隆最新版本 在终端窗 ...

  6. maven聚合与继承笔记

    maven聚合 聚合的目的是为了快速构建项目,当我们有几个maven模块,想要一次性构建,而不是到每个模块下面去执行maven命令,这时候就需要使用maven聚合(或者称为多模块). 使用聚合的时候, ...

  7. Linux系统安装java jdk

    1)下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 我这里下载的是 ...

  8. tornado的ORM

    tornado的ORM 安装sqlalchemy和pymysql pip install sqlalchemy pip install pymysql 连接数据库 from sqlalchemy im ...

  9. 【Debug记录】Exeption thrown by glCreateVertexArrays

    继在机场丢失笔记本后又一大灾难--小组项目无法在老电脑上运行. 位置:glCreateVertexArrays函数 报错:Exception thrown at 0x00000000 in Clien ...

  10. docker 私有仓库 删除镜像

    1.查找官方删除法 https://github.com/burnettk/delete-docker-registry-image 2.民用删除法 https://segmentfault.com/ ...