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

PHP 陣列排序算法實作教學:冒泡、選擇、插入排序完整解析

     編輯:PHP 綜合知識

前言

雖然 PHP 內建 sort()、usort() 等高效排序函數,但理解經典排序算法邏輯,對於面試、教學、特殊場景(如自定義比較、教學示範)至關重要。本文以 PHP 實作三大基礎排序,附上逐步執行追蹤與複雜度分析。

一、冒泡排序

核心思想

重複遍歷陣列,比較相鄰元素,大者後移(升序),每輪將最大值「冒泡」至末尾。

程式碼實作

<?php
function bubbleSort(array &$arr): void {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        $swapped = false;
        for ($j = 0; $j < $n - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                [$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]]; // PHP 7.1+ 解構賦值
                $swapped = true;
            }
        }
        if (!$swapped) break; // 優化:提前結束
    }
}

// 測試
$arr = [3, 5, -1, 0, 2];
bubbleSort($arr);
print_r($arr); // [-1, 0, 2, 3, 5]

執行追蹤(以 [3,5,-1,0,2] 為例)

第1輪外循環:3,5,-1,0,2 → 3,-1,5,0,2 → 3,-1,0,5,2 → 3,-1,0,2,5 (5 就位)
第2輪:3,-1,0,2,5 → -1,3,0,2,5 → -1,0,3,2,5 → -1,0,2,3,5 (3 就位)
第3輪:-1,0,2,3,5 (無交換,提前結束)

複雜度

  • 時間:O(n²) 平均/最差,O(n) 最佳(已排序)
  • 空間:O(1) 原地排序
  • 穩定性:穩定

二、選擇排序

核心思想

每輪從未排序區間選出最小值,與區間首位交換。

程式碼實作

<?php
function selectionSort(array &$arr): void {
    $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]];
        }
    }
}

// 測試
$arr = [2, 1, -1, 3, 0];
selectionSort($arr);
print_r($arr); // [-1, 0, 1, 2, 3]

執行追蹤

初始:2,1,-1,3,0
第1輪:找最小值 -1(索引2),與索引0交換 → -1,1,2,3,0
第2輪:剩餘 [1,2,3,0] 最小值 0(索引4),與索引1交換 → -1,0,2,3,1
第3輪:剩餘 [2,3,1] 最小值 1(索引4),與索引2交換 → -1,0,1,3,2
第4輪:剩餘 [3,2] 最小值 2(索引4),與索引3交換 → -1,0,1,2,3

複雜度

  • 時間:O(n²) 固定(無最佳情況優化)
  • 空間:O(1)
  • 穩定性:不穩定(交換可能改變相等元素相對順序)

三、插入排序

核心思想

維護有序前綴,將下一元素插入已排序區間適當位置(類似整理撲克牌)。

程式碼實作

<?php
function insertionSort(array &$arr): void {
    $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;
    }
}

// 測試
$arr = [2, 1, -1, 3, 0];
insertionSort($arr);
print_r($arr); // [-1, 0, 1, 2, 3]

執行追蹤

初始:2,1,-1,3,0
i=1:key=1,比較 2>1 → 2 後移 → 插入 1 於索引0 → 1,2,-1,3,0
i=2:key=-1,比較 2>-1 → 2 後移;1>-1 → 1 後移 → 插入 -1 於索引0 → -1,1,2,3,0
i=3:key=3,比較 2>3 否 → 插入 3 於索引3 → -1,1,2,3,0
i=4:key=0,比較 3>0 → 3 後移;2>0 → 2 後移;1>0 → 1 後移;-1>0 否 → 插入 0 於索引1 → -1,0,1,2,3

複雜度

  • 時間:O(n²) 平均/最差,O(n) 最佳(近乎有序)
  • 空間:O(1)
  • 穩定性:穩定
  • 適應性:對小規模、近乎有序資料極快

四、三大排序對比總結

算法平均時間最佳時間空間穩定適用場景
冒泡O(n²)O(n)O(1)是教學、極小資料、近乎有序
選擇O(n²)O(n²)O(1)否寫入成本高於讀取、記憶體受限
插入O(n²)O(n)O(1)是小規模、近乎有序、線上排序

五、生產環境建議

  1. 永遠優先使用內建函數:
    sort($arr); // 索引陣列升序
    rsort($arr); // 降序
    asort($arr); // 關聯陣列保持鍵值升序
    uasort($arr, fn($a, $b) => $a <=> $b); // 自定義比較(PHP 7+ 太空船運算子)
  2. 內建函數採用 Timsort(PHP 7.3+),混合歸併與插入,實際效能遠超手寫 O(n²) 算法。
  3. 若需在排序時保留鍵值關聯,使用 uasort/uksort。
  4. 多維陣列排序善用 array_column + array_multisort。

掌握經典算法邏輯,能讓你在面對特殊排序需求(如自定義比較器、外部排序、併發排序)時靈活變通,同時深刻理解為何現代語言內建排序採用混合策略。

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