常用算法的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?>
2. 二分查找 (Binary Search)
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?>
发表评论