<?php
/**
* 基数排序
*/
function radix_sort($arr)
{
$len = count($arr);
if ($len <= 1) {
return $arr;
}
$max = $arr[0];
for ($i = 0; $i < $len; $i++) {
if ($arr[$i] > $max) {
$max = $arr[$i];
}
}
$digit = 0;
while (pow(10, $digit) <= $max) { #根据不同的位数对数组进行桶排序,个位:10(0)、十位:10(1)、百位:10(2)...
$buckets = [];
for ($i = 0; $i < 10; $i++) {
$buckets[$i] = [];
}
for ($j = 0; $j < $len; $j++) {
$remainder = intval($arr[$j] / pow(10, $digit)) % 10; // 在某个数位的数字,先除以10(digit)再取余10
$buckets[$remainder][] = $arr[$j]; #放入桶内
}
$arr = [];
for ($k = 0; $k < 10; $k++) {
$bucket_len = count($buckets[$k]);
if ($bucket_len > 0) {
for ($l = 0; $l < $bucket_len; $l++) {
$arr[] = $buckets[$k][$l]; #重新写回序列中
}
}
}
$digit++;
}
return $arr;
}
//$arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48];
//$arr = [1, 2, 3, 1, 1, 1];
//$arr = range(1, 20);
$arr = array_merge(range(1, 100), range(1, 100));
shuffle($arr);
echo join(',', $arr) . "\n";
$arr = radix_sort($arr);
echo join(',', $arr) . "\n";
基数排序radix_sort
最新推荐文章于 2024-07-24 19:27:00 发布