$insertVal$insertVal,將該元素右移一位$insertVal 的位置或到達數組開頭$insertVal 插入空出的位置時間複雜度:最好 O(n)(已有序)、最壞/平均 O(n²);空間複雜度 O(1),穩定排序。
<?php
$arr = [123, 0, 5, -1, 4, 15];
function insertSort(array &$arr): void {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$insertVal = $arr[$i];
$insertIndex = $i - 1;
// 從右向左查找插入位置
while ($insertIndex >= 0 && $insertVal < $arr[$insertIndex]) {
$arr[$insertIndex + 1] = $arr[$insertIndex]; // 右移
$insertIndex--;
}
// 插入
$arr[$insertIndex + 1] = $insertVal;
}
}
insertSort($arr);
print_r($arr);
/* 輸出:
Array
(
[0] => -1
[1] => 0
[2] => 4
[3] => 5
[4] => 15
[5] => 123
)
*/
將線性查找改為二分查找,比較次數降至 O(log n),但移動次數仍為 O(n²),適合比較操作昂貴的場景。
function binaryInsertSort(array &$arr): void {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$val = $arr[$i];
$left = 0;
$right = $i - 1;
// 二分查找插入位置
while ($left <= $right) {
$mid = (int)(($left + $right) / 2);
if ($val < $arr[$mid]) {
$right = $mid - 1;
} else {
$left = $mid + 1;
}
}
// $left 即為插入位置,右移元素
for ($j = $i - 1; $j >= $left; $j--) {
$arr[$j + 1] = $arr[$j];
}
$arr[$left] = $val;
}
}
sort()(快速排序)、usort() 或 SplHeap/SplPriorityQueue