桶排序
桶排序(Bucket sort)是一种基于计数的排序算法(计数排序可参考上节的内容),工作的原理是将数据分到有限数量的桶子里,然后每个桶再分别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)
算法步骤
1.设置固定数量的空桶。
2.把数据放到对应的桶中。
3.对每个不为空的桶中数据进行排序。
4.拼接不为空的桶中数据,得到结果。
动图展示
PHP代码
```php
<?php
//插入排序
function insertSort($arr){
for ($i=1;$i<count($arr);$i++) {
$temp = $arr[$i];
$j = $i - 1;
while ($j >= 0 && $temp < $arr[$j]) {
$arr[$j+1] = $arr[$j];
$j --;
}
$arr[$j+1] = $temp;
}
return $arr;
}
//桶排序
function bucketSort($arr){
$len = count($arr);
$max = $min = $arr[0];
//选出最大值最小值
for ($i = 1; $i < $len; $i++) {
if ($arr[$i] > $max) {
$max = $arr[$i];
}
if ($arr[$i] < $min) {
$min = $arr[$i];
}
}
$bucket_size = 5; //桶个数
$bucket_len = floor(($max - $min) / $bucket_size) + 1; //桶大小
//桶初始化
$bucket = [];
for ($j = 0 ; $j < $len; $j++) {
$key = floor(($arr[$j] - $min) / $bucket_len);
$bucket[$key][] = $arr[$j];
}
//桶排序
$newArr = [];
for ($i = 0; $i < $bucket_size; $i++) {
if (!isset($bucket[$i])) {
continue;
}
//每个桶内数据插入排序
$bucket[$i] = insertSort($bucket[$i]);
//出桶形成新数据
for ($j = 0; $j < count($bucket[$i]); $j++) {
$newArr[] = $bucket[$i][$j];
}
}
return $newArr;
}
$array = array(1,3,5,2,9,0,6,7,8,4,10,11,12);
$arr = bucketSort($array);
print_r($arr);