PHP 常用算法

PHP 常用算法

排序算法

1. 冒泡排序

function bubbleSort($array) {
    $n = count($array);
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($array[$j] > $array[$j + 1]) {
                // 交换元素
                $temp = $array[$j];
                $array[$j] = $array[$j + 1];
                $array[$j + 1] = $temp;
            }
        }
    }
    return $array;
}

2. 快速排序

function quickSort($array) {
    if (count($array) <= 1) {
        return $array;
    }
    
    $pivot = $array[0];
    $left = $right = array();
    
    for ($i = 1; $i < count($array); $i++) {
        if ($array[$i] < $pivot) {
            $left[] = $array[$i];
        } else {
            $right[] = $array[$i];
        }
    }
    
    return array_merge(quickSort($left), array($pivot), quickSort($right));
}

搜索算法

1. 二分查找

function binarySearch($array, $target) {
    $left = 0;
    $right = count($array) - 1;
    
    while ($left <= $right) {
        $mid = floor(($left + $right) / 2);
        
        if ($array[$mid] == $target) {
            return $mid;
        }
        
        if ($array[$mid] < $target) {
            $left = $mid + 1;
        } else {
            $right = $mid - 1;
        }
    }
    
    return -1; // 未找到
}

字符串算法

1. 字符串反转

function reverseString($str) {
    $length = strlen($str);
    $reversed = '';
    
    for ($i = $length - 1; $i >= 0; $i--) {
        $reversed .= $str[$i];
    }
    
    return $reversed;
}

2. 判断回文字符串

function isPalindrome($str) {
    $str = strtolower(preg_replace('/[^a-zA-Z0-9]/', '', $str));
    return $str == strrev($str);
}

数学算法

1. 斐波那契数列

function fibonacci($n) {
    if ($n <= 1) {
        return $n;
    }
    
    $a = 0;
    $b = 1;
    
    for ($i = 2; $i <= $n; $i++) {
        $c = $a + $b;
        $a = $b;
        $b = $c;
    }
    
    return $b;
}

2. 判断素数

function isPrime($num) {
    if ($num <= 1) {
        return false;
    }
    
    for ($i = 2; $i <= sqrt($num); $i++) {
        if ($num % $i == 0) {
            return false;
        }
    }
    
    return true;
}

数组算法

1. 数组去重

function removeDuplicates($array) {
    return array_values(array_unique($array));
}

2. 寻找数组中的最大值和最小值

function findMinMax($array) {
    $min = $max = $array[0];
    
    foreach ($array as $value) {
        if ($value < $min) {
            $min = $value;
        }
        if ($value > $max) {
            $max = $value;
        }
    }
    
    return ['min' => $min, 'max' => $max];
}

图算法

1. 广度优先搜索 (BFS)

function bfs($graph, $start) {
    $visited = [];
    $queue = new SplQueue();
    
    $queue->enqueue($start);
    $visited[$start] = true;
    
    while (!$queue->isEmpty()) {
        $vertex = $queue->dequeue();
        echo $vertex . " ";
        
        foreach ($graph[$vertex] as $neighbor) {
            if (!isset($visited[$neighbor])) {
                $visited[$neighbor] = true;
                $queue->enqueue($neighbor);
            }
        }
    }
}

递归算法

1. 阶乘计算

function factorial($n) {
    if ($n <= 1) {
        return 1;
    }
    return $n * factorial($n - 1);
}

2. 汉诺塔问题

function hanoi($n, $from, $to, $via) {
    if ($n == 1) {
        echo "Move disk 1 from $from to $to\n";
    } else {
        hanoi($n - 1, $from, $via, $to);
        echo "Move disk $n from $from to $to\n";
        hanoi($n - 1, $via, $to, $from);
    }
}

动态规划算法

1. 斐波那契数列(动态规划版)

function fibonacciDP($n) {
    if ($n <= 1) {
        return $n;
    }
    
    $dp = [0, 1];
    for ($i = 2; $i <= $n; $i++) {
        $dp[$i] = $dp[$i - 1] + $dp[$i - 2];
    }
    
    return $dp[$n];
}

2. 0-1背包问题

function knapSack($W, $weights, $values, $n) {
    $dp = array_fill(0, $n + 1, array_fill(0, $W + 1, 0));
    
    for ($i = 1; $i <= $n; $i++) {
        for ($w = 1; $w <= $W; $w++) {
            if ($weights[$i - 1] <= $w) {
                $dp[$i][$w] = max(
                    $values[$i - 1] + $dp[$i - 1][$w - $weights[$i - 1]],
                    $dp[$i - 1][$w]
                );
            } else {
                $dp[$i][$w] = $dp[$i - 1][$w];
            }
        }
    }
    
    return $dp[$n][$W];
}

加密算法

1. MD5加密

function md5Hash($string) {
    return md5($string);
}

2. SHA256加密

function sha256Hash($string) {
    return hash('sha256', $string);
}

路径查找算法

1. Dijkstra最短路径算法

function dijkstra($graph, $start) {
    $distances = [];
    $visited = [];
    $vertices = array_keys($graph);
    
    foreach ($vertices as $vertex) {
        $distances[$vertex] = INF;
        $visited[$vertex] = false;
    }
    
    $distances[$start] = 0;
    
    for ($i = 0; $i < count($vertices) - 1; $i++) {
        $minVertex = minDistance($distances, $visited);
        $visited[$minVertex] = true;
        
        foreach ($graph[$minVertex] as $vertex => $weight) {
            if (!$visited[$vertex] && $distances[$minVertex] != INF && 
                $distances[$minVertex] + $weight < $distances[$vertex]) {
                $distances[$vertex] = $distances[$minVertex] + $weight;
            }
        }
    }
    
    return $distances;
}

function minDistance($distances, $visited) {
    $min = INF;
    $minVertex = null;
    
    foreach ($distances as $vertex => $distance) {
        if (!$visited[$vertex] && $distance <= $min) {
            $min = $distance;
            $minVertex = $vertex;
        }
    }
    
    return $minVertex;
}

树算法

1. 二叉树遍历(前序、中序、后序)

class TreeNode {
    public $value;
    public $left;
    public $right;
    
    public function __construct($value) {
        $this->value = $value;
        $this->left = null;
        $this->right = null;
    }
}

// 前序遍历
function preOrder($root) {
    if ($root != null) {
        echo $root->value . " ";
        preOrder($root->left);
        preOrder($root->right);
    }
}

// 中序遍历
function inOrder($root) {
    if ($root != null) {
        inOrder($root->left);
        echo $root->value . " ";
        inOrder($root->right);
    }
}

// 后序遍历
function postOrder($root) {
    if ($root != null) {
        postOrder($root->left);
        postOrder($root->right);
        echo $root->value . " ";
    }
}

实用算法

1. 生成随机字符串

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    
    return $randomString;
}

2. 验证邮箱格式

function validateEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

PHP 高级算法与实用技巧

分治算法

1. 归并排序

function mergeSort($array) {
    if (count($array) <= 1) {
        return $array;
    }
    
    $mid = (int)(count($array) / 2);
    $left = array_slice($array, 0, $mid);
    $right = array_slice($array, $mid);
    
    return merge(mergeSort($left), mergeSort($right));
}

function merge($left, $right) {
    $result = [];
    while (count($left) > 0 && count($right) > 0) {
        if ($left[0] < $right[0]) {
            $result[] = array_shift($left);
        } else {
            $result[] = array_shift($right);
        }
    }
    
    return array_merge($result, $left, $right);
}

2. 快速选择算法(寻找第K小元素)

function quickSelect($array, $k) {
    if (count($array) <= 1) {
        return $array[0] ?? null;
    }
    
    $pivot = $array[0];
    $left = $right = [];
    
    for ($i = 1; $i < count($array); $i++) {
        if ($array[$i] < $pivot) {
            $left[] = $array[$i];
        } else {
            $right[] = $array[$i];
        }
    }
    
    $leftCount = count($left);
    if ($k <= $leftCount) {
        return quickSelect($left, $k);
    } elseif ($k == $leftCount + 1) {
        return $pivot;
    } else {
        return quickSelect($right, $k - $leftCount - 1);
    }
}

贪心算法

1. 找零钱问题

function coinChange($coins, $amount) {
    rsort($coins); // 从大到小排序
    $result = [];
    
    foreach ($coins as $coin) {
        while ($amount >= $coin) {
            $amount -= $coin;
            $result[] = $coin;
        }
    }
    
    return $amount === 0 ? $result : false;
}

2. 活动选择问题

function activitySelection($activities) {
    // 按结束时间排序
    usort($activities, function($a, $b) {
        return $a[1] - $b[1];
    });
    
    $selected = [];
    $lastEnd = 0;
    
    foreach ($activities as $activity) {
        if ($activity[0] >= $lastEnd) {
            $selected[] = $activity;
            $lastEnd = $activity[1];
        }
    }
    
    return $selected;
}

回溯算法

1. 八皇后问题

class NQueens {
    private $solutions = [];
    private $size;
    
    public function solve($n) {
        $this->size = $n;
        $this->backtrack([], 0);
        return $this->solutions;
    }
    
    private function backtrack($queens, $row) {
        if ($row === $this->size) {
            $this->solutions[] = $queens;
            return;
        }
        
        for ($col = 0; $col < $this->size; $col++) {
            if ($this->isSafe($queens, $row, $col)) {
                $queens[$row] = $col;
                $this->backtrack($queens, $row + 1);
            }
        }
    }
    
    private function isSafe($queens, $row, $col) {
        for ($i = 0; $i < $row; $i++) {
            // 检查列冲突和对角线冲突
            if ($queens[$i] === $col || 
                abs($queens[$i] - $col) === abs($i - $row)) {
                return false;
            }
        }
        return true;
    }
}

2. 全排列生成

function permutations($array) {
    $result = [];
    $this->permute($array, 0, count($array) - 1, $result);
    return $result;
}

private function permute(&$array, $left, $right, &$result) {
    if ($left == $right) {
        $result[] = $array;
    } else {
        for ($i = $left; $i <= $right; $i++) {
            $this->swap($array, $left, $i);
            $this->permute($array, $left + 1, $right, $result);
            $this->swap($array, $left, $i);
        }
    }
}

private function swap(&$array, $i, $j) {
    $temp = $array[$i];
    $array[$i] = $array[$j];
    $array[$j] = $temp;
}

图算法进阶

1. Floyd-Warshall 最短路径算法

function floydWarshall($graph) {
    $dist = $graph;
    $n = count($dist);
    
    for ($k = 0; $k < $n; $k++) {
        for ($i = 0; $i < $n; $i++) {
            for ($j = 0; $j < $n; $j++) {
                if ($dist[$i][$k] + $dist[$k][$j] < $dist[$i][$j]) {
                    $dist[$i][$j] = $dist[$i][$k] + $dist[$k][$j];
                }
            }
        }
    }
    
    return $dist;
}

2. Kruskal 最小生成树算法

class Kruskal {
    private $parent = [];
    
    public function findMST($edges, $vertices) {
        usort($edges, function($a, $b) {
            return $a[2] - $b[2];
        });
        
        foreach ($vertices as $vertex) {
            $this->parent[$vertex] = $vertex;
        }
        
        $mst = [];
        foreach ($edges as $edge) {
            $root1 = $this->find($edge[0]);
            $root2 = $this->find($edge[1]);
            
            if ($root1 != $root2) {
                $mst[] = $edge;
                $this->parent[$root1] = $root2;
            }
        }
        
        return $mst;
    }
    
    private function find($vertex) {
        if ($this->parent[$vertex] != $vertex) {
            $this->parent[$vertex] = $this->find($this->parent[$vertex]);
        }
        return $this->parent[$vertex];
    }
}

实用数据处理算法

1. 大数据分块处理

function processLargeData($data, $chunkSize, $callback) {
    $total = count($data);
    $processed = 0;
    
    while ($processed < $total) {
        $chunk = array_slice($data, $processed, $chunkSize);
        $callback($chunk);
        $processed += count($chunk);
    }
}

2. 内存高效数组去重

function largeArrayUnique($array) {
    $temp = [];
    foreach ($array as $key => $value) {
        $hash = md5(serialize($value));
        if (!isset($temp[$hash])) {
            $temp[$hash] = $value;
        }
    }
    return array_values($temp);
}

性能优化技巧

1. 记忆化技术(Memoization)

function memoize($func) {
    $cache = [];
    return function() use ($func, &$cache) {
        $args = func_get_args();
        $key = md5(serialize($args));
        
        if (!isset($cache[$key])) {
            $cache[$key] = call_user_func_array($func, $args);
        }
        
        return $cache[$key];
    };
}

// 使用示例
$fibonacci = memoize(function($n) {
    return ($n <= 1) ? $n : $fibonacci($n - 1) + $fibonacci($n - 2);
});

2. 延迟加载大数据集

class LazyDataLoader implements Iterator {
    private $position = 0;
    private $data = [];
    private $loadCallback;
    private $chunkSize;
    
    public function __construct($loadCallback, $chunkSize = 1000) {
        $this->loadCallback = $loadCallback;
        $this->chunkSize = $chunkSize;
        $this->loadChunk();
    }
    
    private function loadChunk() {
        $this->data = call_user_func(
            $this->loadCallback, 
            $this->position, 
            $this->chunkSize
        );
        $this->position += $this->chunkSize;
    }
    
    public function current() {
        return current($this->data);
    }
    
    public function next() {
        next($this->data);
        if (key($this->data) === null) {
            $this->loadChunk();
        }
    }
    
    public function key() {
        return key($this->data);
    }
    
    public function valid() {
        return key($this->data) !== null;
    }
    
    public function rewind() {
        $this->position = 0;
        $this->loadChunk();
    }
}
这里是用PHP写的几个基础算法算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重要的,经典名句:算法+数据结构=程序。作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序员,请好好学C,学好数据结构与算法。这里仅仅只是几个基础算法,还有很多东东要学…… 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 <?phpfor($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo ' '; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… <?php$arr = array(3, 2, 1);$n = count($arr); //每循环一次,就跑一趟后面的排序for($j=0; $j<$n-1; $j++) {//对后面没排好的,循环查找出最大(最小)的,进行一趟排序 for($i=$j; $i<$n-1; $i++) { if($arr[$j] > $arr[$i+1]) { $t = $arr[$j]; $arr[$j] = $arr[$i+1]; $arr[$i+1] = $t; } }}print_r($arr); 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行一行的输出,有兴趣去写着玩下。 11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1 <?php//每行的第一个和最后一个都为1,写了6行 for($i=0; $i<6; $i++) { $a[$i][0]=1; $a[$i][$i]=1; } //出除了第一位和最后一位的值,保存在数组中 for($i=2; $i<6; $i++) { for($j=1; $j<$i; $j++) { $a[$i][$j] = $a[$i-1][$j-1]+$a[$i-1][$j]; } } //打印 for($i=0; $i<6; $i++){ for($j=0; $j<=$i; $j++) { echo $a[$i][$j].' '; } echo '<br/>'; } 4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。 思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。 <?php$in = 2;$arr = array(1,1,1,3,5,7);$n = count($arr);//如果要插入的数已经最大,直接打印if($arr[$n-1] < $in) { $arr[$n+1] = $in; print_r($arr); } for($i=0; $i<$n; $i++) {//找出要插入的位置 if($arr[$i] >= $in){ $t1= $arr[$i]; $arr[$i] = $in;//把后面的数据后移一位 for($j=$i+1; $j<$n+1; $j++) { $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; }//打印 print_r($arr); die; }} 5、对一组数进行排序(快速排序算法)。 思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。 <?phpfunction q($array) { if (count($array) <= 1) {return $array;}//以$key为界,分成两个子数组 $key = $array[0]; $l = array(); $r = array(); //分别进行递归排序,然后合成一个数组 for ($i=1; $i<count($array); $i++) { if ($array[$i] <= $key) { $l[] = $array[$i]; } else { $r[] = $array[$i]; } } $l = q($l); $r = q($r); return array_merge($l, array($key), $r);} $arr = array(1,2,44,3,4,33);print_r( q($arr) ); 6、在一个数组查找你所需元素(二分查找算法)。 思路:以数组中某个值为界,再递归进行查找,直到结束。 <?phpfunction find($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return find($array, $low, $mid-1, $k); }else{ return find($array, $mid+1, $high, $k); } } die('Not have...');} //test$array = array(2,4,3,5);$n = count($array);$r = find($array,0,$n, 7、合并多个数组,不用array_merge(),题目来于论坛。 思路:遍历每个数组,重新组成一个新数组。 <?phpfunction t(){ $c = func_num_args()-1; $a = func_get_args(); //print_r($a); for($i=0; $i<=$c; $i++){ if(is_array($a[$i])){ for($j=0; $j<count($a[$i]); $j++){ $r[] = $a[$i][$j]; } } else { die('Not a array!'); } } return $r;} //testprint_r(t(range(1,4),range(1,4),range(1,4)));echo '<br/>';$a = array_merge(range(1,4),range(1,4),range(1,4));print_r($a); 8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛) <?phpfunction t($n) { static $num = 1 for($j=1; $j<=$n; $j++){ if($j>=4 && $j<15) {$num++;t($n-$j);} if($j==20){$num--;} } return $num;} //testecho t(8); 这里是用PHP写的几个基础算法算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重要的,经典名句:算法+数据结构=程序。作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序员,请好好学C,学好数据结构与算法。这里仅仅只是几个基础算法,还有很多东东要学…… 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 <?phpfor($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo ' '; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… <?php$arr = array(3, 2, 1);$n = count($arr); //每循环一次,就跑一趟后面的排序for($j=0; $j<$n-1; $j++) {//对后面没排好的,循环查找出最大(最小)的,进行一趟排序 for($i=$j; $i<$n-1; $i++) { if($arr[$j] > $arr[$i+1]) { $t = $arr[$j]; $arr[$j] = $arr[$i+1]; $arr[$i+1] = $t; } }}print_r($arr); 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行一行的输出,有兴趣去写着玩下。 11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1 <?php//每行的第一个和最后一个都为1,写了6行 for($i=0; $i<6; $i++) { $a[$i][0]=1; $a[$i][$i]=1; } //出除了第一位和最后一位的值,保存在数组中 for($i=2; $i<6; $i++) { for($j=1; $j<$i; $j++) { $a[$i][$j] = $a[$i-1][$j-1]+$a[$i-1][$j]; } } //打印 for($i=0; $i<6; $i++){ for($j=0; $j<=$i; $j++) { echo $a[$i][$j].' '; } echo '<br/>'; } 4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。 思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。 <?php$in = 2;$arr = array(1,1,1,3,5,7);$n = count($arr);//如果要插入的数已经最大,直接打印if($arr[$n-1] < $in) { $arr[$n+1] = $in; print_r($arr); } for($i=0; $i<$n; $i++) {//找出要插入的位置 if($arr[$i] >= $in){ $t1= $arr[$i]; $arr[$i] = $in;//把后面的数据后移一位 for($j=$i+1; $j<$n+1; $j++) { $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; }//打印 print_r($arr); die; }} 5、对一组数进行排序(快速排序算法)。 思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。 <?phpfunction q($array) { if (count($array) <= 1) {return $array;}//以$key为界,分成两个子数组 $key = $array[0]; $l = array(); $r = array(); //分别进行递归排序,然后合成一个数组 for ($i=1; $i<count($array); $i++) { if ($array[$i] <= $key) { $l[] = $array[$i]; } else { $r[] = $array[$i]; } } $l = q($l); $r = q($r); return array_merge($l, array($key), $r);} $arr = array(1,2,44,3,4,33);print_r( q($arr) ); 6、在一个数组查找你所需元素(二分查找算法)。 思路:以数组中某个值为界,再递归进行查找,直到结束。 <?phpfunction find($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return find($array, $low, $mid-1, $k); }else{ return find($array, $mid+1, $high, $k); } } die('Not have...');} //test$array = array(2,4,3,5);$n = count($array);$r = find($array,0,$n, 7、合并多个数组,不用array_merge(),题目来于论坛。 思路:遍历每个数组,重新组成一个新数组。 <?phpfunction t(){ $c = func_num_args()-1; $a = func_get_args(); //print_r($a); for($i=0; $i<=$c; $i++){ if(is_array($a[$i])){ for($j=0; $j<count($a[$i]); $j++){ $r[] = $a[$i][$j]; } } else { die('Not a array!'); } } return $r;} //testprint_r(t(range(1,4),range(1,4),range(1,4)));echo '<br/>';$a = array_merge(range(1,4),range(1,4),range(1,4));print_r($a); 8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛) <?phpfunction t($n) { static $num = 1 for($j=1; $j<=$n; $j++){ if($j>=4 && $j<15) {$num++;t($n-$j);} if($j==20){$num--;} } return $num;} //testecho t(8);
### PHP中的算法实现 PHP是一种广泛应用于Web开发语言,但它同样可以用于各种算法的实现。下面是一些常见的算法及其在PHP中的实现方式。 #### 排序算法示例 快速排序是一种高效的排序方法,在PHP中可以通过递归来实现[^1]: ```php function quickSort($arr) { if (count($arr) <= 1) { return $arr; } $pivot = $arr[0]; $left = []; $right = []; for ($i = 1; $i < count($arr); $i++) { if ($arr[$i] < $pivot) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } return array_merge(quickSort($left), [$pivot], quickSort($right)); } ``` #### 查找算法示例 二分查找适用于已排序数组,其效率较高。以下是基于迭代的二分查找实现[^2]: ```php function binarySearch($array, $value) { $low = 0; $high = count($array) - 1; while ($low <= $high) { $mid = floor(($low + $high) / 2); if ($array[$mid] === $value) { return $mid; } elseif ($array[$mid] > $value) { $high = $mid - 1; } else { $low = $mid + 1; } } return -1; } ``` #### 动态规划实例 斐波那契数列是一个经典的动态规划问题。通过缓存中间结果来优化性能[^3]: ```php function fibonacci($n) { if ($n == 0 || $n == 1) { return $n; } $fib = [0 => 0, 1 => 1]; for ($i = 2; $i <= $n; $i++) { $fib[$i] = $fib[$i - 1] + $fib[$i - 2]; } return $fib[$n]; } ``` 以上代码展示了如何利用PHP编写一些基本但重要的算法。这些例子不仅有助于理解算法本身的工作原理,还能够提升编程技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值