<?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. elasticsearch在linux上的安装,Centos7.X elasticsearch 7.6.2

    本文环境:Elasticsearch7.6.2目前最先版本   centos7.X     JDK1.8 elasticsearch介绍 官网:https://www.elastic.co/cn/pr ...

  2. centos7 编译安装mysql5.7

    mysql源码可以到官网下载 安装依赖包 yum -y install gcc gcc-c++ ncurses ncurses-devel bison libgcrypt perl make cmak ...

  3. 获取data 数据

    export function getData(el, name, val) { const prefix = 'data-' if (val) { return el.setAttribute(pr ...

  4. Eclipse(Eclipse for android)代码自动提示设置

    java代码和xml资源代码在有的eclipse中可以自己提示,但有的并不支持这个功能,还得我们人为去调整,主要原因是因为你们下载的elipse的渠道不同,获得的版本有的官方原版,有的是个人备份版等等 ...

  5. PTA 6-1 单链表逆转

    本题是一个非常经典的题目:单链表逆转. 这是链表结点的定义: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储 ...

  6. python3(三十三)debug

    """ 调试 """ __author__on__ = 'shaozhiqi 2019/9/23' # 调试程序 # . print打印,没 ...

  7. Cilium使用 (Cilium 3)

    使用k3s测试Cilium,安装步骤可以参见官方文档 Cilium安装使用 docker安装 使用如下命令安装最新版本的docker yum install -y yum-utils \ device ...

  8. 天天在用Redis,持久化方案你又知道哪些?

    前言 文章首发于微信公众号[码猿技术专栏]:天天用Redis,持久化方案有哪些你知道吗? Redis目前已经成为主流的内存数据库了,但是大部分人仅仅是停留在会用的阶段,你真的了解Redis内部的工作原 ...

  9. GeoGebra函数使用

    分段函数使用 输入指令: If(x < -2, x, -2 < x < 2, x², x > 2, x)

  10. 2020.4面试分享(7面收5个offer)

    都说金三银四是找工作的最佳时节,由于本人的个人职业规划跟目前工作内容不太相符(具体原因就不透露了,领导平时也要来这里逛,哈哈),四月份挑选了10多家公司投递简历(公司规模从几十人到上万人都有),参加了 ...