首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 經典排序算法實現集錦:冒泡、選擇、插入、快速排序完整代碼

     編輯:PHP 綜合知識

算法複雜度速查

算法平均時間最壞時間空間穩定性
冒泡排序O(n²)O(n²)O(1)穩定
交換排序O(n²)O(n²)O(1)不穩定
選擇排序O(n²)O(n²)O(1)不穩定
插入排序O(n²)O(n²)O(1)穩定
快速排序O(n log n)O(n²)O(log n)不穩定

完整 PHP 實現

<?php
// 冒泡排序:相鄰比較,大元素沉底
function bubbleSort(array $arr): array {
    $n = count($arr);
    for ($i = 1; $i < $n; $i++) {
        for ($j = $n - 1; $j >= $i; $j--) {
            if ($arr[$j] < $arr[$j - 1]) {
                [$arr[$j - 1], $arr[$j]] = [$arr[$j], $arr[$j - 1]]; // 解構賦值交換
            }
        }
    }
    return $arr;
}

// 交換排序:基準元素與後續逐一比較交換
function exchangeSort(array $arr): array {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = $i + 1; $j < $n; $j++) {
            if ($arr[$j] < $arr[$i]) {
                [$arr[$i], $arr[$j]] = [$arr[$j], $arr[$i]];
            }
        }
    }
    return $arr;
}

// 選擇排序:每輪選最小值放到有序區末尾
function selectionSort(array $arr): array {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        $minIdx = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($arr[$j] < $arr[$minIdx]) $minIdx = $j;
        }
        if ($minIdx !== $i) {
            [$arr[$i], $arr[$minIdx]] = [$arr[$minIdx], $arr[$i]];
        }
    }
    return $arr;
}

// 插入排序:將無序區元素插入有序區適當位置
function insertionSort(array $arr): array {
    $n = count($arr);
    for ($i = 1; $i < $n; $i++) {
        $key = $arr[$i];
        $j = $i - 1;
        while ($j >= 0 && $arr[$j] > $key) {
            $arr[$j + 1] = $arr[$j];
            $j--;
        }
        $arr[$j + 1] = $key;
    }
    return $arr;
}

// 快速排序:分治法,基準值分區遞歸
function quickSort(array $arr): array {
    $n = count($arr);
    if ($n <= 1) return $arr;
    $pivot = $arr[0];
    $left = $right = [];
    for ($i = 1; $i < $n; $i++) {
        if ($arr[$i] < $pivot) $left[] = $arr[$i];
        else $right[] = $arr[$i];
    }
    return array_merge(quickSort($left), [$pivot], quickSort($right));
}

// 測試
$data = [7, 1, 6, 5, 2];
echo "原始: " . implode(',', $data) . "\n";
echo "冒泡: " . implode(',', bubbleSort($data)) . "\n";
echo "交換: " . implode(',', exchangeSort($data)) . "\n";
echo "選擇: " . implode(',', selectionSort($data)) . "\n";
echo "插入: " . implode(',', insertionSort($data)) . "\n";
echo "快速: " . implode(',', quickSort($data)) . "\n";
?>

輸出結果

原始: 7,1,6,5,2
冒泡: 1,2,5,6,7
交換: 1,2,5,6,7
選擇: 1,2,5,6,7
插入: 1,2,5,6,7
快速: 1,2,5,6,7

實戰選擇指南

  • 數據量 < 50、教學演示:插入排序(代碼簡潔、近乎有序時 O(n))
  • 通用中小數據、追求簡潔:sort()/usort() 內建函數(C 實現的 QuickSort/MergeSort 混合)
  • 大數據、性能敏感:不建議純 PHP 實現,改用扩展(php-ds、FFI 調用 C++)、或資料庫 ORDER BY
  • 外部排序/海量文件:歸併排序 + 臨時文件分塊

內建函數對比

<?php
$arr = [7,1,6,5,2];
sort($arr);           // 重建索引,升序
rsort($arr);          // 降序
usort($arr, fn($a,$b) => $a <=> $b); // 自定義比較(太空船操作符 PHP 7+)
asort($arr);          // 保持鍵值關聯升序
ksort($arr);          // 按鍵名排序
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved