<?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. 模块 schedule 定时任务

    schedule模块实现定时任务 2018-08-29 15:01:51 更多 一.官方示例 import schedule import time def job(): print("I' ...

  2. HIT软件构造课程3.2总结(Designing Specificaton)

    本节转向“方法/函数/操作”如何定义 上一节是名词 这一节是动词 1.编程语言中的函数和方法 方法 使用者不需要知道方法内部如何实现,这叫做“抽象”. 参数 参数类型是否匹配,在静态检查时完成. 返回 ...

  3. Python itchat库(1)

    一.实验环境 在cmd中输入以下命令,完成微信的API包itchat的安装. pip install itchat 注意这里有个问题,因为电脑里既有Python3.6,又有anaconda.所以一定要 ...

  4. python爬虫之requests的高级使用

    1.requests能上传文件 # 导入requests模块 import requests # 定义一个dict files = {'file': open('D:/360Downloads/1.t ...

  5. 1048 Find Coins (25分)

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  6. 【docker linux】linux系统镜像转化为docker镜像

    概述 使用docker安装linux的同学都知道,你在docker提供的仓库安装linux系统,你就会体验到最精简的.最纯净的linux系统,当然,他会精简到你连ifconfig命令都需要自己配置,恰 ...

  7. var、let和const的区别详解

      let 和 const 是 ECMAScript6 新推出的特性,其中 let 是能够替代 var 的"标准",所以我们探讨 var.let 和 const 的区别,首先应该知 ...

  8. Android 启动一个Activity的几种方式

    启动一个Activity的几种方式在Android中我们可以通过下面两种方式来启动一个新的Activity,注意这里是怎么启动,而非启动模式!分为显示启动和隐式启动! 1.显式启动,通过包名来启动,写 ...

  9. 22.3 Extends 构造方法的执行顺序

    /** 1.有子父类继承关系的类中,创建父类对象未调用,执行父类无参构造* 2.有子父类继承关系的类中,创建子类对象未调用,执行顺序:默认先调用 父类无参构造---子类无参构造* 在子类的构造方法的第 ...

  10. MySQL REPLACE INTO 的使用

    前段时间写游戏合服工具时出现过一个问题,源DB和目标DB角色表中主键全部都不相同,从源DB取出玩家数据再使用 replace into 写入目标DB中,结果总有几条数据插入时会导致目标DB中原有的角色 ...