插入排序是一種直觀、易於理解的排序算法,適合小規模數據或近乎有序的數組。本文通過實例拆解其核心邏輯,並提供封裝後的 PHP 函數供直接使用。
以數組 [2, 6, 3, 9] 為例,目標是降序排列。插入排序將數組分為「已排序區」和「未排序區」。初始時,第一個元素視為已排序。每次從未排序區取出首個元素,在已排序區中從右向左比較,找到合適位置插入,並將較大元素右移。
[6, 2, 3, 9][6, 3, 2, 9][9, 6, 3, 2]封裝為函數,採用引用傳參(&$arr)直接修改原數組,避免拷貝開銷:
<?php
/**
* 插入排序(降序)
* @param array &$arr 待排序數組(引用傳參)
*/
function insertSort(&$arr) {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$insertVal = $arr[$i]; // 待插入的值
// 內層循環:從已排序區右端向左掃描
for ($j = $i; $j > 0; $j--) {
if ($insertVal > $arr[$j - 1]) {
$arr[$j] = $arr[$j - 1]; // 後移
} else {
break; // 找到位置,提前結束內層循環
}
}
$arr[$j] = $insertVal; // 插入
}
}
// 測試
$myarr = array(2, 6, 3, 9);
insertSort($myarr);
echo '<pre>';
print_r($myarr); // 輸出: Array ( [0] => 9 [1] => 6 [2] => 3 [3] => 2 )
?>
$arr[$i] 存入變量 $insertVal,減少數組訪問次數。break,一旦找到插入位置立即跳出,避免無謂比較。數據量較小(< 50)、部分有序、或作為快速排序等高級算法的小區間優化。大數據量請改用快速排序、歸並排序或 PHP 內建 rsort()。