桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:
在额外空间充足的情况下,尽量增大桶的数量
使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中
同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
-
什么时候最快
当输入的数据可以均匀的分配到每一个桶中。 -
什么时候最慢
当输入的数据被分配到了同一个桶中。
代码:
<?php
function bucket_sort($arr = [], $bucket_size = 5)
{
list($max, $min) = get_max_min($arr);
$bucket_count = floor(($max - $min) / $bucket_size);
$buckets = [];
for ($i = 0; $i < $bucket_count; $i++) {
$buckets[$i] = [];
}
foreach ($arr as $val) {
$buckets[floor(($val - $min) / $bucket_size)][] = $val;
}
$tmp_arr = [];
foreach ($buckets as $bucket) {
if(is_array($bucket)){
sort($bucket); // 可使用任意排序算法
$tmp_arr = array_merge($tmp_arr, $bucket);
}
}
return $tmp_arr;
}
function get_max_min($arr)
{
if(empty($arr)){
return [-1, -1];
}
$min = $max = $arr[0];
foreach ($arr as $val) {
if ($val < $min) {
$min = $val;
}
if ($val > $max) {
$max = $val;
}
}
return [$max, $min];
}
$arr = [2, 13, 1, 5, 99, 24, 23, 33];
// $arr = [3, 34, 443, 123, 2, 1, 543, 534234, 19, 234,9434];
$arr = bucket_sort($arr, 10);
print_r($arr);
输出:
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 13
[4] => 23
[5] => 24
[6] => 33
[7] => 99
)