按 Enter 键跳转到正文

常用算法的PHP实现

常用算法的PHP实现

1. 快速排序 (Quick Sort)

 1<?php
 2function quickSort($arr) {
 3    if (count($arr) <= 1) {
 4        return $arr;
 5    }
 6    
 7    $pivot = $arr[0];
 8    $left = $right = [];
 9    
10    for ($i = 1; $i < count($arr); $i++) {
11        if ($arr[$i] < $pivot) {
12            $left[] = $arr[$i];
13        } else {
14            $right[] = $arr[$i];
15        }
16    }
17    
18    return array_merge(quickSort($left), [$pivot], quickSort($right));
19}
20
21// 测试
22$numbers = [64, 34, 25, 12, 22, 11, 90];
23echo "原始数组: " . implode(', ', $numbers) . "\n";
24echo "快速排序: " . implode(', ', quickSort($numbers)) . "\n";
25?>
 1<?php
 2function binarySearch($arr, $target) {
 3    $left = 0;
 4    $right = count($arr) - 1;
 5    
 6    while ($left <= $right) {
 7        $mid = floor(($left + $right) / 2);
 8        
 9        if ($arr[$mid] == $target) {
10            return $mid; // 找到目标,返回索引
11        }
12        
13        if ($arr[$mid] < $target) {
14            $left = $mid + 1;
15        } else {
16            $right = $mid - 1;
17        }
18    }
19    
20    return -1; // 未找到
21}
22
23// 测试(数组必须已排序)
24$sortedArray = [2, 5, 8, 12, 16, 23, 38, 45, 67];
25$target = 23;
26$result = binarySearch($sortedArray, $target);
27
28echo "在数组 [" . implode(', ', $sortedArray) . "] 中查找 $target\n";
29echo "结果索引: " . ($result !== -1 ? $result : "未找到") . "\n";
30?>

3. 斐波那契数列 (Fibonacci)

 1<?php
 2// 递归版本(简单但效率低)
 3function fibonacciRecursive($n) {
 4    if ($n <= 1) {
 5        return $n;
 6    }
 7    return fibonacciRecursive($n - 1) + fibonacciRecursive($n - 2);
 8}
 9
10// 动态规划版本(高效)
11function fibonacciDP($n) {
12    if ($n <= 1) {
13        return $n;
14    }
15    
16    $dp = [0, 1];
17    for ($i = 2; $i <= $n; $i++) {
18        $dp[$i] = $dp[$i - 1] + $dp[$i - 2];
19    }
20    
21    return $dp[$n];
22}
23
24// 测试
25$n = 10;
26echo "斐波那契数列前{$n}项:\n";
27for ($i = 0; $i < $n; $i++) {
28    echo fibonacciDP($i) . " ";
29}
30echo "\n";
31?>

4. 广度优先搜索 (BFS)

 1<?php
 2function bfs($graph, $start) {
 3    $visited = [];
 4    $queue = new SplQueue();
 5    
 6    $visited[$start] = true;
 7    $queue->enqueue($start);
 8    $result = [];
 9    
10    while (!$queue->isEmpty()) {
11        $vertex = $queue->dequeue();
12        $result[] = $vertex;
13        
14        foreach ($graph[$vertex] as $neighbor) {
15            if (!isset($visited[$neighbor])) {
16                $visited[$neighbor] = true;
17                $queue->enqueue($neighbor);
18            }
19        }
20    }
21    
22    return $result;
23}
24
25// 测试
26$graph = [
27    'A' => ['B', 'C'],
28    'B' => ['A', 'D', 'E'],
29    'C' => ['A', 'F'],
30    'D' => ['B'],
31    'E' => ['B', 'F'],
32    'F' => ['C', 'E']
33];
34
35echo "BFS遍历结果: " . implode(' -> ', bfs($graph, 'A')) . "\n";
36?>

5. 冒泡排序 (Bubble Sort)

 1<?php
 2function bubbleSort($arr) {
 3    $n = count($arr);
 4    
 5    for ($i = 0; $i < $n - 1; $i++) {
 6        $swapped = false;
 7        
 8        for ($j = 0; $j < $n - $i - 1; $j++) {
 9            if ($arr[$j] > $arr[$j + 1]) {
10                // 交换元素
11                $temp = $arr[$j];
12                $arr[$j] = $arr[$j + 1];
13                $arr[$j + 1] = $temp;
14                $swapped = true;
15            }
16        }
17        
18        // 如果没有交换,说明已经排序完成
19        if (!$swapped) {
20            break;
21        }
22    }
23    
24    return $arr;
25}
26
27// 测试
28$numbers = [64, 34, 25, 12, 22, 11, 90];
29echo "冒泡排序: " . implode(', ', bubbleSort($numbers)) . "\n";
30?>

6. 查找最大子数组和 (Kadane算法)

 1<?php
 2function maxSubArraySum($arr) {
 3    $maxSoFar = $arr[0];
 4    $maxEndingHere = $arr[0];
 5    
 6    for ($i = 1; $i < count($arr); $i++) {
 7        $maxEndingHere = max($arr[$i], $maxEndingHere + $arr[$i]);
 8        $maxSoFar = max($maxSoFar, $maxEndingHere);
 9    }
10    
11    return $maxSoFar;
12}
13
14// 测试
15$array = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
16echo "数组: " . implode(', ', $array) . "\n";
17echo "最大子数组和: " . maxSubArraySum($array) . "\n"; // 输出: 6
18?>

7. 判断素数

 1<?php
 2function isPrime($n) {
 3    if ($n <= 1) return false;
 4    if ($n <= 3) return true;
 5    if ($n % 2 == 0 || $n % 3 == 0) return false;
 6    
 7    for ($i = 5; $i * $i <= $n; $i += 6) {
 8        if ($n % $i == 0 || $n % ($i + 2) == 0) {
 9            return false;
10        }
11    }
12    
13    return true;
14}
15
16// 测试
17$numbers = [2, 3, 4, 17, 25, 29];
18foreach ($numbers as $num) {
19    echo "$num 是" . (isPrime($num) ? "素数" : "非素数") . "\n";
20}
21?>

发表评论