常用算法的PHP实现

1. 快速排序 (Quick Sort)

<?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));
}

// 测试
$numbers = [64, 34, 25, 12, 22, 11, 90];
echo "原始数组: " . implode(', ', $numbers) . "\n";
echo "快速排序: " . implode(', ', quickSort($numbers)) . "\n";
?>
<?php
function binarySearch($arr, $target) {
    $left = 0;
    $right = count($arr) - 1;
    
    while ($left <= $right) {
        $mid = floor(($left + $right) / 2);
        
        if ($arr[$mid] == $target) {
            return $mid; // 找到目标,返回索引
        }
        
        if ($arr[$mid] < $target) {
            $left = $mid + 1;
        } else {
            $right = $mid - 1;
        }
    }
    
    return -1; // 未找到
}

// 测试(数组必须已排序)
$sortedArray = [2, 5, 8, 12, 16, 23, 38, 45, 67];
$target = 23;
$result = binarySearch($sortedArray, $target);

echo "在数组 [" . implode(', ', $sortedArray) . "] 中查找 $target\n";
echo "结果索引: " . ($result !== -1 ? $result : "未找到") . "\n";
?>

3. 斐波那契数列 (Fibonacci)

<?php
// 递归版本(简单但效率低)
function fibonacciRecursive($n) {
    if ($n <= 1) {
        return $n;
    }
    return fibonacciRecursive($n - 1) + fibonacciRecursive($n - 2);
}

// 动态规划版本(高效)
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];
}

// 测试
$n = 10;
echo "斐波那契数列前{$n}项:\n";
for ($i = 0; $i < $n; $i++) {
    echo fibonacciDP($i) . " ";
}
echo "\n";
?>

4. 广度优先搜索 (BFS)

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

// 测试
$graph = [
    'A' => ['B', 'C'],
    'B' => ['A', 'D', 'E'],
    'C' => ['A', 'F'],
    'D' => ['B'],
    'E' => ['B', 'F'],
    'F' => ['C', 'E']
];

echo "BFS遍历结果: " . implode(' -> ', bfs($graph, 'A')) . "\n";
?>

5. 冒泡排序 (Bubble Sort)

<?php
function bubbleSort($arr) {
    $n = count($arr);
    
    for ($i = 0; $i < $n - 1; $i++) {
        $swapped = false;
        
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                // 交换元素
                $temp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $temp;
                $swapped = true;
            }
        }
        
        // 如果没有交换,说明已经排序完成
        if (!$swapped) {
            break;
        }
    }
    
    return $arr;
}

// 测试
$numbers = [64, 34, 25, 12, 22, 11, 90];
echo "冒泡排序: " . implode(', ', bubbleSort($numbers)) . "\n";
?>

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

<?php
function maxSubArraySum($arr) {
    $maxSoFar = $arr[0];
    $maxEndingHere = $arr[0];
    
    for ($i = 1; $i < count($arr); $i++) {
        $maxEndingHere = max($arr[$i], $maxEndingHere + $arr[$i]);
        $maxSoFar = max($maxSoFar, $maxEndingHere);
    }
    
    return $maxSoFar;
}

// 测试
$array = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
echo "数组: " . implode(', ', $array) . "\n";
echo "最大子数组和: " . maxSubArraySum($array) . "\n"; // 输出: 6
?>

7. 判断素数

<?php
function isPrime($n) {
    if ($n <= 1) return false;
    if ($n <= 3) return true;
    if ($n % 2 == 0 || $n % 3 == 0) return false;
    
    for ($i = 5; $i * $i <= $n; $i += 6) {
        if ($n % $i == 0 || $n % ($i + 2) == 0) {
            return false;
        }
    }
    
    return true;
}

// 测试
$numbers = [2, 3, 4, 17, 25, 29];
foreach ($numbers as $num) {
    echo "$num 是" . (isPrime($num) ? "素数" : "非素数") . "\n";
}
?>