計數排序 - Counting Sort

ajiang02發表於2020-04-09

簡介

計數排序是一種穩定的線性時間排序演算法。
計數排序使用一個額外的陣列 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

計數排序 - Counting Sort

筆記

SplFixedArray 類:生成固定長度陣列

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章