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

PHP 排序演算法類別封裝:插入、選擇、冒泡、快速排序完整實現與效能測試

     編輯:PHP 相關知識

PHP 排序演算法類別封裝:插入、選擇、冒泡、快速排序完整實現與效能測試

將四種經典排序演算法封裝為統一介面的 Sort 類別,支援配置化選擇演算法、除錯日誌、陣列驗證。適合教學演示與中小數據集排序需求。

演算法複雜度對照

演算法平均時間最壞時間空間穩定性適用場景
插入排序O(n²)O(n²)O(1)穩定小數據、近乎有序
選擇排序O(n²)O(n²)O(1)不穩定寫入成本高(如 EEPROM)
冒泡排序O(n²)O(n²)O(1)穩定教學、極小數據
快速排序O(n log n)O(n²)O(log n)不穩定通用大數據排序

類別完整代碼

<?php
class Sort {
    private $arr = [], $sort = 'insert', $marker = '_sort', $debug = true;

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

    public function display() { return $this->arr; }

    private function _init($config) {
        foreach ($config as $k=>$v) if (isset($this->$k)) $this->$k = $v;
        $method = $this->sort . $this->marker;
        if (!method_exists($this, $method)) return false;
        $this->arr = $this->$method($this->arr);
        return true;
    }

    // 插入排序
    private function insert_sort($arr) {
        $n = count($arr);
        for ($i=1; $i<$n; $i++) {
            $tmp = $arr[$i];
            for ($j=$i-1; $j>=0 && $arr[$j]>$tmp; $j--) $arr[$j+1] = $arr[$j];
            $arr[$j+1] = $tmp;
        }
        return $arr;
    }

    // 選擇排序
    private function select_sort($arr) {
        $n = count($arr);
        for ($i=0; $i<$n-1; $i++) {
            $min = $i;
            for ($j=$i+1; $j<$n; $j++) if ($arr[$j] < $arr[$min]) $min = $j;
            if ($min != $i) { $tmp=$arr[$i]; $arr[$i]=$arr[$min]; $arr[$min]=$tmp; }
        }
        return $arr;
    }

    // 冒泡排序
    private function bubble_sort($arr) {
        $n = count($arr);
        for ($i=0; $i<$n; $i++)
            for ($j=$n-1; $j>$i; $j--)
                if ($arr[$j] < $arr[$j-1]) { $tmp=$arr[$j]; $arr[$j]=$arr[$j-1]; $arr[$j-1]=$tmp; }
        return $arr;
    }

    // 快速排序(遞歸分治)
    private function quick_sort($arr) {
        if (count($arr) <= 1) return $arr;
        $key = $arr[0];
        $left = $right = [];
        for ($i=1; $iquick_sort($left), [$key], $this->quick_sort($right));
    }

    private function _log($msg) {
        @file_put_contents('sort_err.log', date('Y-m-d H:i:s')." $msg\n", FILE_APPEND);
    }
}
?>

使用範例

require_once('sort.php');

$config = [
    'arr'   => [23,22,41,18,20,12,200303,2200,1192],
    'sort'  => 'quick',   // insert, select, bubble, quick
    'debug' => true
];

$sorter = new Sort($config);
var_dump($sorter->display());
// 輸出: [12,18,20,22,23,41,1192,2200,200303]

生產環境建議

  • PHP 內建 sort()、usort() 實現為 混合快速排序(C 語言級效能),永遠優先使用。
  • 僅在以下情況考慮自定義排序:
    • 教學/面試演示
    • 特殊比較邏輯無法用回調函數表達
    • 嵌入式環境無標準庫
  • 大數據量(> 10 萬)必須用 usort() 或資料庫 ORDER BY。

此封裝展示了「策略模式」在演算法選擇上的經典應用,是理解排序原理與 PHP 類別設計的優秀練習題材。

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