計數排序不是基於比較的排序算法,其核心在於將輸入的數據值轉化爲鍵存儲在額外開闢的數組空間中。 做爲一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有肯定範圍的整數。php
找出待排序的數組中最大和最小的元素; 統計數組中每一個值爲i的元素出現的次數,存入數組C的第i項; 對全部的計數累加(從C中的第一個元素開始,每一項和前一項相加); 反向填充目標數組:將每一個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。
/** * 計數排序: 桶排序的一種 */ $arr = [5,69,4,32,14,8,74,95,23,56,41,5,31,63]; $length = count($arr); $maxValue = $arr[0]; // 找出數組中的最大值 for ($i=1; $i < $length; $i++) { if ($arr[$i] > $maxValue) { $maxValue = $arr[$i]; } } /** * 定長數組, 鍵會自動排序, PHP數組是hash表的實現, * 若是這裏用普通的數組, 鍵不會自動排序, 不存在的鍵也不會自動填充null */ $frequency = new SplFixedArray($maxValue + 1); /** * 統計arr中, 值出現的頻次 */ for ($i=0; $i < $length; $i++) { if(empty($frequency[$arr[$i]])) $frequency[$arr[$i]] = 0; $frequency[$arr[$i]] += 1; } // 清空$arr $arr = []; // 遍歷frequency, 若是其元素有值, 那麼將鍵push到arr中 for ($i=0; $i < count($frequency); $i++) { if (!empty($frequency[$i])) { for ($j=0; $j < $frequency[$i]; $j++) { $arr[] = $i; } } } print_r($arr);
參考文章: https://www.cnblogs.com/onepi...html