簡介
計數排序是一種穩定的線性時間排序演算法。
計數排序使用一個額外的陣列 C,其中第i個元素是待排序陣列 A 中值等於i 的元素的個數。然後根據陣列 C 來將 A 中的元素排到正確的位置。
時間複雜度
當輸入的元素是 n 個 0 到 k 之間的整數時,時間複雜度為 O ( n + k )
程式碼
方法一
public function counting_sort()
{
$arr = [0, 3, 6, 2, 4, 10, 2, 4, 78];
$min = min($arr); // 陣列最小值
$max = max($arr); // 陣列最大值
// 迴圈陣列,計算每個元素出現的次數,$count[] 下標為 $arr 元素值
$count = [];
foreach ($arr as $k) {
$count[$k] = isset($count[$k]) ? $count[$k]+1 : 1;
}
// 從最小值迴圈到最大值,如果在 $arr 有出現,則按出現的次數插入 $sort 中
$sort = [];
for ($i=$min; $i<=$max; $i++) {
if (isset($count[$i])) {
// 迴圈個數,插入
while ($count[$i]-- > 0) {
$sort[] =$i;
}
}
}
}
方法二
public function counting_sort()
{
$arr = [0, 3, 6, 2, 4, 10, 2, 4, 78];
//SplFixedArray 具有固定長度,並且僅允許範圍內的整數作為索引。
$count = new \SplFixedArray(max($arr)+1);
// 統計數字個數: 迴圈陣列$arr,將其值作為 $count陣列的下標,下標對應的值為數字的個數
foreach ($arr as $k) {
$count[$k] = $count[$k] + 1 ;
}
// 填充到目標陣列 $sort:根據統計的數量,push 到新陣列 $sort
$sort = [];
foreach ($count as $item => $i) {
// 如果統計陣列 $count 的值不為 null
if (!empty($i)) {
// 迴圈個數,插入
while ($i-- > 0) {
$sort[] = $item;
}
}
}
}
列印 $sort
筆記
SplFixedArray 類:生成固定長度陣列
本作品採用《CC 協議》,轉載必須註明作者和本文連結