PHP 計數排序

計數排序不是基於比較的排序算法,其核心在於將輸入的數據值轉化爲鍵存儲在額外開闢的數組空間中。 做爲一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有肯定範圍的整數。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

相關文章
相關標籤/搜索