將四種經典排序演算法封裝為統一介面的 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]
sort()、usort() 實現為 混合快速排序(C 語言級效能),永遠優先使用。usort() 或資料庫 ORDER BY。此封裝展示了「策略模式」在演算法選擇上的經典應用,是理解排序原理與 PHP 類別設計的優秀練習題材。