博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
经典算法
阅读量:6113 次
发布时间:2019-06-21

本文共 12905 字,大约阅读时间需要 43 分钟。

 

1 function BubbleSort(&$arr){ 2     for($i=0;$i
冒泡排序

 

1 $arr=[3,5,1,3,7,8,9,5,0,5]; 2 QuickSort($arr,0,count($arr)-1); 3 echo json_encode($arr); 4 function QuickSort(&$arr,$left,$right){ 5     if($left<$right){ 6         $key=$arr[$left]; 7         $low=$left; 8         $high=$right; 9         while ($low < $high) {10             while ($arr[$high] >= $key && $low < $high) {11                 $high --;12             }13             $arr[$low]=$arr[$high];14             while ($arr[$low] <= $key && $low < $high) {15                $low ++;16             }17             $arr[$high]=$arr[$low];18         }19         $arr[$low]=$key;20         QuickSort($arr,$left,$low-1);21         QuickSort($arr,$low+1,$right);22     }23 }
快速排序

 

1 $arr1=[0,3,5,5,7,8,9,20,30,57]; 2 echo binarySearch($arr1,20); 3 function binarySearch($arr,$element){ 4     $left = 0; 5     $right = count($arr)-1; 6     while ($left<$right){ 7         $mid =round(($left+$right)/2); 8         if($arr[$mid]>$element){ 9             $right = $mid-1;10 11         }else if($arr[$mid]<$element){12             $left = $mid+1;13         }else{14             return $mid;15         }16     }17     return -1;18 }
折半查找

 

1 function moveTower($n,$A="A",$B="B",$C="C"){ 2         if($n==1){ 3             echo "{
$n}:{
$A}-->{
$C}\n"; 4 }else{ 5 //将最上面的n-1个从A通过C移动到B 6 $this->moveTower($n-1,$A,$C,$B); 7 //将最下面第n个最大的盘子直接从A移动到C 8 echo "{
$n}:{
$A}-->{
$C}\n"; 9 //再将现在都在B上的n-1个从B通过A移动到C上10 $this->moveTower($n-1,$B,$A,$C);11 }12 }
汉诺塔递归

 

1 class StackByQueue{ 2     private $queue1=null; 3     private $queue2=null; 4     function __construct() 5     { 6         $this->queue1 = new \SplQueue(); 7         $this->queue2 = new \SplQueue(); 8     } 9     function __destruct()10     {11         $this->queue1=null;12         $this->queue2=null;13     }14 15     public function Pop(){16         if($this->queue1->isEmpty()){17             return null;18         }19         while($this->queue1->count()!=1){20             $this->queue2->enqueue($this->queue1->dequeue());21         }22         $pop = $this->queue1->dequeue();23         while(!$this->queue2->isEmpty()){24             $this->queue1->enqueue($this->queue2->dequeue());25         }26         return $pop;27 28     }29     public function Push($ele){30         $this->queue1->enqueue($ele);31     }32 }
使用队列实现栈的功能

 

1 class QueueByStack{ 2     private $stack1=null; 3     private $stack2 = null; 4     function __construct() 5     { 6         $this->stack1 = new \SplStack(); 7         $this->stack2 = new \SplStack(); 8     } 9     function __destruct()10     {11         $this->stack1 = null;12         $this->stack2 = null;13     }14 15     public function EnQueue($ele){16         $this->stack1->push($ele);17     }18     public function DeQueue(){19         while(!$this->stack1->isEmpty()){20             $this->stack2->push($this->stack1->pop());21         }22         if($this->stack2->isEmpty()){23             return null;24         }else{25             $pop = $this->stack2->pop();26             while(!$this->stack2->isEmpty()){27                 $this->stack1->push($this->stack2->pop());28             }29             return $pop;30         }31     }32 }
使用栈实现队列的功能

 

早晨一女生背着一堆书出了图书馆,结果警报响了,大妈让女生看看是哪本书把警报弄响了,那女生把书倒出来,准备一本一本的测。大妈见状急了,把书分成两份,第一份过了一下,响了。又把这一份分成两份接着测,三回就找到了,大妈用鄙视的眼神看着女生,仿佛在说O(n)和O(logn)都分不清。
结果图书馆丢了n-1本书。class TreeNode{    public $number = 0;    public $level = 0;    public $originNumber = 0;    public function __construct($originNumber0, $number0, $level0)    {        $this->number = $number0;        $this->level = $level0;        $this->originNumber = $originNumber0;    }}function getHalf(TreeNode $treeNode, &$arr){    $maxLevel = 4;    $number = $treeNode->number;    $level = $treeNode->level;    $originNumber = $treeNode->originNumber;    $a_half = intval($number / 2);    $b_half = $number - $a_half;    $level++;    if ($level > $maxLevel || $a_half == 0 || $b_half == 0) {        return;    }    if (($a_half == 1 && $level == $maxLevel) || ($b_half == 1 && $level == $maxLevel)) {        !in_array($originNumber, $arr) && $arr[] = $originNumber;        return;    }    if ($a_half > 1) {        getHalf(new TreeNode($originNumber, $a_half, $level), $arr);    }    if ($b_half > 1) {        getHalf(new TreeNode($originNumber, $b_half, $level), $arr);    }}$arr0 = [];for ($i = 0; $i < 1000; $i++) {    getHalf(new TreeNode($i, $i, 0), $arr0);}echo json_encode($arr0);die;输出:[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
求一个脑筋急转弯的N是多少

 

1 class STreeNode  2 {  3     public $level = 0;  4     public $leftChild = null;  5     public $rightChild = null;  6     public $parent = null;  7     public $key = null;  8     public $data = null;  9 } 10  11 class STree 12 { 13  14     public $root = null; 15  16     public function __construct(STreeNode $root) 17     { 18         $this->root = $root; 19     } 20  21     /** 22      * @desc: 二叉树节点插入 23      * @author: 流火行者 24      * @date: 2019/3/12 6:41 PM 25      * --------------------------------- 26      * 支付宝首页搜“510992378”查看留言 27      * --------------------------------- 28      * @param STreeNode $childNode 29      * @param STreeNode $parentNode 30      */ 31     public function insert(STreeNode $childNode, STreeNode $parentNode) 32     { 33         $childNode->level = $parentNode->level + 1; 34         $childNode->parent = $parentNode; 35         $childNode->data = []; 36         if ($childNode->key > $parentNode->key) { 37             if ($parentNode->rightChild == null) { 38                 $parentNode->rightChild = $childNode; 39             } else { 40                 $this->insert($childNode, $parentNode->rightChild); 41             } 42         } else { 43             if ($parentNode->leftChild == null) { 44                 $parentNode->leftChild = $childNode; 45             } else { 46                 $this->insert($childNode, $parentNode->leftChild); 47             } 48         } 49     } 50  51     public function search($key, STreeNode $parentNode = null, &$list = []) 52     { 53         if ($parentNode == null) return; 54         if ($key == $parentNode->key) { 55             $list[] = $parentNode; 56         } else { 57             $this->search($key, $parentNode->leftChild, $list); 58             $this->search($key, $parentNode->rightChild, $list); 59         } 60     } 61  62     public function delete() 63     { 64  65     } 66  67     /** 68      * @desc: 递归前序遍历 69      * @author: 流火行者 70      * @date: 2019/3/12 6:41 PM 71      * --------------------------------- 72      * 支付宝首页搜“510992378”查看留言 73      * --------------------------------- 74      * @param STreeNode|null $node 75      */ 76     public function preOrderTraverse(STreeNode $node = null) 77     { 78         if ($node == null) return; 79         echo $node->key . PHP_EOL; 80         $this->inOrderTraverse($node->leftChild); 81         $this->inOrderTraverse($node->rightChild); 82     } 83  84     public function preOrderTraverseLoop() 85     { 86         $stack = new SplStack(); 87         $pNode = $this->root; 88         while (!$stack->isEmpty() || $pNode != null) { 89             if ($pNode != null) { 90                 echo $pNode->key . PHP_EOL; 91                 $stack->push($pNode); 92                 $pNode = $pNode->leftChild; 93             } else { 94                 $node = $stack->pop(); 95  96                 $pNode = $node->rightChild; 97  98             } 99         }100     }101 102     /**103      * @desc: 递归中序遍历104      * @author: 流火行者105      * @date: 2019/3/12 6:41 PM106      * ---------------------------------107      * 支付宝首页搜“510992378”查看留言108      * ---------------------------------109      * @param STreeNode|null $node110      */111     public function inOrderTraverse(STreeNode $node = null)112     {113         if ($node == null) return;114         $this->inOrderTraverse($node->leftChild);115         echo $node->key . '|level=' . $node->level . PHP_EOL;116         $this->inOrderTraverse($node->rightChild);117     }118 119     /**120      * @desc: 循环中序遍历121      * @author: 流火行者122      * @date: 2019/3/12 6:40 PM123      * ---------------------------------124      * 支付宝首页搜“510992378”查看留言125      * ---------------------------------126      */127     public function inOrderTraverseLoop()128     {129         $stack = new SplStack();130         $pNode = $this->root;131         while ($pNode != null || !$stack->isEmpty()) {132             if ($pNode != null) {133                 $stack->push($pNode);134                 $pNode = $pNode->leftChild;135             } else {136                 $node = $stack->pop();137                 echo $node->key . '|';138                 $pNode = $node->rightChild;139             }140         }141     }142 143     /**144      * @desc: 后序遍历(递归)145      * @author: 流火行者146      * @date: 2019/3/12 6:40 PM147      * ---------------------------------148      * 支付宝首页搜“510992378”查看留言149      * ---------------------------------150      * @param STreeNode|null $node151      */152     public function postOrderTraverse(STreeNode $node = null)153     {154         if ($node == null) return;155         $this->postOrderTraverse($node->leftChild);156         $this->postOrderTraverse($node->rightChild);157         echo $node->key . PHP_EOL;158     }159 160     /**161      * @desc: 循环后序遍历162      * @author: 流火行者163      * @date: 2019/3/12 6:58 PM164      * ---------------------------------165      * 支付宝首页搜“510992378”查看留言166      * ---------------------------------167      */168     public function postOrderTraverseLoop()169     {170         //todo171     }172 173     /**174      * @desc: 层次遍历175      * @author: 流火行者176      * @date: 2019/3/12 6:40 PM177      * ---------------------------------178      * 支付宝首页搜“510992378”查看留言179      * ---------------------------------180      */181     public function layerOrderTraverseLoop()182     {183         $queue = new SplQueue();184         $queue->enqueue($this->root);185         echo PHP_EOL;186         while (!$queue->isEmpty()) {187             $o = $queue->dequeue();188             if (empty($o)) break;189             echo 'key=' . $o->key . "#level=" . $o->level . PHP_EOL;190             if ($o->leftChild != null) {191                 $queue->enqueue($o->leftChild);192             }193             if ($o->rightChild != null) {194                 $queue->enqueue($o->rightChild);195             }196         }197     }198 199 }200 201 $arr = [3, 7, 2, 4, 6, 9];202 //$arr = [2,7,3,6,9,2.5,4];203 204 //$arr = array_reverse($arr);205 $rootNode = new STreeNode();206 $rootNode->level = 0;207 $rootNode->key = 5;208 $rootNode->data = [];209 $tree = new STree($rootNode);210 foreach ($arr as $item) {211     $node = new STreeNode();212     $node->key = $item;213     $node->data = [];214     $tree->insert($node, $rootNode);215 }216 //$tree->inOrderTraverse($tree->root);217 //$tree->inOrderTraverseLoop();218 $tree->postOrderTraverse($rootNode);219 echo PHP_EOL;220 $tree->postOrderTraverseLoop();221 //$tree->layerOrderTraverseLoop();222 $list = [];223 //$tree->search(37,$tree->root,$list);
二叉排序树 

 

1 $list = [3, 5, 1, 2, 7, 3, 8, 2, 9]; 2  3 mergerSort($list, 0, count($list) - 1); 4  5 function mergerSort(&$arr = [], $left, $right) 6 { 7     $mid = intval(($left + $right) / 2); 8     if ($left < $right) { 9         mergerSort($arr, $left, $mid);10         mergerSort($arr, $mid + 1, $right);11         echo 'left:'.json_encode(array_slice($arr, $left, $mid - $left + 1)) . PHP_EOL;12         echo 'right:'.json_encode(array_slice($arr, $mid + 1, $right - $mid)) . PHP_EOL;13         mergeArray($arr,$left,$mid,$right);14     }15 }16 17 function mergeArray(&$arr = [], $left, $mid, $right)18 {19     $i = $left;20     $j = $mid + 1;21     $k = 0;22     $temp = [];23     //有序两个数组合并24     while ($i <= $mid && $j <= $right) {25         if ($arr[$i] <= $arr[$j]) {26             $temp[$k++] = $arr[$i++];27         } else {28             $temp[$k++] = $arr[$j++];29         }30     }31     //左侧剩余的直接合并,左和右只可能有一个有剩余32     while ($i <= $mid) {33         $temp[$k++] = $arr[$i++];34     }35     //右侧剩余的直接合并36     while ($j <= $right) {37         $temp[$k++] = $arr[$j++];38     }39     //修改原数组40     $k=0;41     while ($left<=$right){42         $arr[$left++] = $temp[$k++];43     }44     echo 'merge'.json_encode($temp) . PHP_EOL;45     echo  PHP_EOL;46 }47 48 输出:49 left:[3]50 right:[5]51 merge[3,5]52 53 left:[3,5]54 right:[1]55 merge[1,3,5]56 57 left:[2]58 right:[7]59 merge[2,7]60 61 left:[1,3,5]62 right:[2,7]63 merge[1,2,3,5,7]64 65 left:[3]66 right:[8]67 merge[3,8]68 69 left:[2]70 right:[9]71 merge[2,9]72 73 left:[3,8]74 right:[2,9]75 merge[2,3,8,9]76 77 left:[1,2,3,5,7]78 right:[2,3,8,9]79 merge[1,2,2,3,3,5,7,8,9]
二路归并排序

 

未完待续....

转载于:https://www.cnblogs.com/JimmyBright/p/6669059.html

你可能感兴趣的文章
Lua学习笔记(8): 元表
查看>>
PHP经典算法题
查看>>
LeetCode 404 Sum of Left Leaves
查看>>
醋泡大蒜有什么功效
查看>>
hdu 5115(2014北京—dp)
查看>>
数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)...
查看>>
PHP读取日志里数据方法理解
查看>>
第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码
查看>>
Vivado增量式编译
查看>>
一个很好的幻灯片效果的jquery插件--kinMaxShow
查看>>
微信支付签名配置正确,但返回-1,调不出支付界面(有的手机能调起,有的不能)...
查看>>
第二周例行报告
查看>>
Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)...
查看>>
实验八 sqlite数据库操作
查看>>
四种简单的排序算法(转)
查看>>
Quartz2D之着色器使用初步
查看>>
多线程条件
查看>>
Git [remote rejected] xxxx->xxxx <no such ref>修复了推送分支的错误
查看>>
Porter/Duff,图片加遮罩setColorFilter
查看>>
黄聪:VMware安装Ubuntu10.10【图解】转
查看>>