1. 概述
- 思路:创建数组,以值为键,出现次数为值,再对各数进行累加(比如0出现2次,1出现3次:[0=>2, 1=>3]。累加:[0=>2, 1=>5]。),然后对原序进行逆向迭代每个值,根据累加位置填入到新的有序数组中。
- 稳定性:稳定
-
2. 实现代码
```php <?php //设定脚本执行时间限制 set_time_limit(0); //最大可用内存 ini_set(‘memory_limit’, -1); class CountSort { private $ori = []; public $new = []; public function __construct(array $arr) {
$this->ori = $arr;$r = $this->count($this->ori);$this->new = $r;
}
private function count(array $arr) {
// 分布$map = [];for ($i = 0; $i < count($arr); $i++) {$map[$arr[$i]]++;}ksort($map);// 分布累加$pre = key($map);foreach ($map as $k => $v) {if ($k != $pre) {$map[$k] += $map[$pre];$pre = $k;}}// 生成新数组$ret = new SplFixedArray(count($arr));$arr = array_reverse($arr, true);foreach ($arr as $v) {$ret[--$map[$v]] = $v;}return $ret;
} }
// 1000万考生,成绩排序 $count = 10100100*100; for ($i = 0; $i <= $count; $i++) { $arr[] = rand(0, 750); } $starttime = explode(‘ ‘,microtime()); echo microtime(); $cls = new CountSort($arr); $endtime = explode(‘ ‘,microtime()); $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]); $thistime = round($thistime,3); echo “本网页执行耗时:”.$thistime.” 秒。”.time();
// 少量数据 // $arr = [0,1,2,1,0,1,1,0,-3]; // $cls = new CountSort($arr); // echo implode(‘,’, $cls->new); ```
