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

PHP 經典排序算法完整指南:冒泡、快速、選擇、插入排序實現與優化

     編輯:PHP 相關知識

前言

排序算法是程式設計的基礎核心,掌握各類排序邏輯不僅能提升代碼效能,更是面試與實戰開發的必備技能。本文將系統整理 PHP 中四大經典排序算法——冒泡排序、快速排序、選擇排序、插入排序的原理、代碼實現與優化方案,並提供一個可複用的排序類庫供實戰參考。

一、冒泡排序

核心思想

冒泡排序透過相鄰元素兩兩比較,將較大(或較小)的元素逐步「冒泡」至序列末端。雖然時間複雜度為 O(n²),但邏輯直觀,適合教學與小規模數據。

標準實現

function bubbleSort(array $arr): array {
    $len = count($arr);
    if ($len <= 1) return $arr;

    for ($i = 0; $i < $len; $i++) {
        // 優化:若某輪無交換則提前結束
        $swapped = false;
        for ($j = $len - 1; $j > $i; $j--) {
            if ($arr[$j] < $arr[$j - 1]) {
                [$arr[$j], $arr[$j - 1]] = [$arr[$j - 1], $arr[$j]];
                $swapped = true;
            }
        }
        if (!$swapped) break;
    }
    return $arr;
}

二、快速排序

核心思想

快速排序採用分治法:選取基準值,將陣列分為「小於基準」與「大於基準」兩部分,再遞歸排序子陣列。平均時間複雜度 O(n log n),是實戰中最高效的通用排序之一。

標準實現

function quickSort(array $arr): array {
    $len = count($arr);
    if ($len <= 1) return $arr;

    $pivot = $arr[0];
    $left = $right = [];

    for ($i = 1; $i < $len; $i++) {
        if ($arr[$i] <= $pivot) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }

    return array_merge(quickSort($left), [$pivot], quickSort($right));
}

三、選擇排序

核心思想

每輪從未排序區間選出最小值,放至已排序區間末尾。雖然同為 O(n²),但交換次數較冒泡排序少,適合寫入成本高的場景。

標準實現

function selectionSort(array $arr): array {
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        $minIdx = $i;
        for ($j = $i + 1; $j < $len; $j++) {
            if ($arr[$j] < $arr[$minIdx]) $minIdx = $j;
        }
        if ($minIdx !== $i) {
            [$arr[$i], $arr[$minIdx]] = [$arr[$minIdx], $arr[$i]];
        }
    }
    return $arr;
}

四、插入排序

核心思想

將陣列分為「已排序」與「未排序」兩區,每次從未排序區取出元素,在已排序區從右向左掃描並插入合適位置。對近乎有序數據極其高效,最佳情況 O(n)。

標準實現

function insertionSort(array $arr): array {
    $len = count($arr);
    for ($i = 1; $i < $len; $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;
}

五、進階:可複用排序類庫

為方便實戰調用,封裝一個支援多種算法、可配置的排序類:

<?php
class Sorter {
    private array $data = [];
    private string $algorithm = 'insert';
    private bool $debug = false;

    public function __construct(array $config = []) {
        if ($config) $this->init($config);
    }

    private function init(array $config): bool {
        foreach ($config as $key => $val) {
            if (property_exists($this, $key)) $this->$key = $val;
        }
        $method = $this->algorithm . 'Sort';
        if (!method_exists($this, $method)) return false;
        $this->data = $this->$method($this->data);
        return true;
    }

    public function getResult(): array { return $this->data; }

    // 四大排序私有方法(同上標準實現,略)
    private function insertSort(array $arr): array { /* ... */ }
    private function selectSort(array $arr): array { /* ... */ }
    private function bubbleSort(array $arr): array { /* ... */ }
    private function quickSort(array $arr): array { /* ... */ }
}

// 使用範例
$sorter = new Sorter([
    'data' => [49, 38, 65, 97, 76, 13, 27],
    'algorithm' => 'quick',
    'debug' => true
]);
print_r($sorter->getResult());

六、算法選擇建議

算法平均複雜度空間複雜度穩定性適用場景
冒泡排序O(n²)O(1)穩定教學、極小數據
快速排序O(n log n)O(log n)不穩定通用高效排序首選
選擇排序O(n²)O(1)不穩定寫入成本高、小數據
插入排序O(n²)O(1)穩定近乎有序、小數據

結語

理解排序算法的底層邏輯,能幫助開發者根據數據特徵選擇最優方案。實際專案中,優先使用 PHP 內建的 sort()、usort() 等高度優化函式;僅在特殊需求(如自定義比較、教學演示)時手寫算法。希望本文能成為你 PHP 排序開發的實用參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved