一、基本思想
桶排序是将待排序的数据分割成许多buckets,然后每个bucket各自排序,或用不同的排序算法,或者递归的使用bucket sort算法。也是典型的分而治之(divide-and-conquer)的策略。
二、算法过程及PHP代码实现
1)找出待排序数组arr中的最大值max、最小值min;
2)设置一个定量的数组当作空桶,范围为min~max(min、max为步骤1求得的最小值、最大值);
3)遍历待排序数组arr,计算每个元素arr[i]放的桶,把数据放到对应的桶里;
4)如果桶不为空,对桶中的数据进行排序;
5)遍历桶数组,把所有桶中排序好的元素放到一个新的数组里。
例如:
待排序数组为5,3,5,2,8,其最小值是2,最大值是8,可以在2-8的取值范围内定义一个桶数组$bucket,并且让所有的元素值都为0;
对需要排序的数组进行循环遍历,将数据依次放到对应的桶中,即:
首先是5,则使bucket[5]++,继续遍历,bucket[5]++,继续遍历,bucket[2]=1,bucket[3]=1,bucket[3]=1,bucket[5]=2,$bucket[8]=1,
然后循环bucket数组,若bucket数组,若bucket[2]=1,则循环输出元素2一次,$arr[5]=2,则循环输出5两次,结果为 2 3 5 5 8
PHP代码如下:
<?php
function bucketSort($arr) {
// 设置木桶
$bucket = [];
$min = min($arr);
$max = max($arr);
// bucket=arrayfill(bucket=arrayfill(min, max−max−min + 1, 0);
for ($m = $min; $m <= $max; $m++) {
$bucket[$m] = 0;
}
// 将待排数据按照范围放到对应的木桶中
$cnt = count($arr);
for ($n = 0; $n < $cnt; $n++) {
$bucket[$arr[$n]]++;
}
// 从木桶中拿出数据
$result = [];
for ($i = $min; $i <= $max; $i++) {
if (($bucket[$i]) > 0) {
for ($j = 1; $j <= $bucket[$i]; $j++) {
$result[] = [$i];
}
}
}
// 处理数组
$res = [];
foreach ($result as $v) {
$res[] = $v[0];
}
return $res;
}
$arr = [12, 31, 85, 7, 41, 34, 10, 96];
$res = bucketSort($arr);
print_r($res);

设置木桶也可以先确定木桶的个数,即n = (max - min) / arr.length + 1,其中,max、min为待排序数组的最大值、最小值,然后桶的范围为0-(n-1),后面的步骤同前面的3-5步相同。
PHP代码如下:
<?php
function bucketSort(&$arr) {
$min = min($arr);
$max = max($arr);
$n = $max - $min + 1;
$buckets = [];
for ($i = 0; $i < $n; $i++) {
$buckets[$i] = 0;
}
for ($i = 0; $i < count($arr); $i++) {
$buckets[$arr[$i] - $min]++;
}
$k = 0;
for ($i = 0; $i < $n; $i++) {
while ($buckets[$i]-- > 0) {
$arr[$k++] = $i + $min;
}
}
}

三、效率分析
对于N个待排数据,M个桶,
1、时间复杂度:O(N+C),其中C=N*(logN-logM)
2、空间复杂度:O(N+M),稳定性排序
3、缺陷:
1)参与排序的数组存放的必须是整数。
2)数组中的最大数和最小数保持在一个合理的间距内。
3)需要额外的内存空间。
四、算法改进
按着上述代码,如果要排序的范围是1-100万,将申请大量的内存,也就是设置了100万个桶。为了节省内存,可以改进这个算法,把待排序数组划分为n个大小相同的子区间(桶),然后基于某种映射函数,将待排序序列的元素映射到第i个桶中,再对每个桶中的所有元素排序,最后合并。
1)确定元素的最大值max、最小值min、数组长度length;
2)确定桶数:n = (max - min) / length + 1;
3)确定桶的编号:0 ~ (n - 1);
4)确定数组元素对应的桶的编号:index = (x - min) / length;
5)对每个桶进行排序;
6)合并所有桶的元素。
PHP代码如下:
<?php
function bucketSort($arr) {
$length = count($arr);
$min = min($arr);
$max = max($arr);
$n = ceil(($max - $min) / $length) + 1;
// 设置木桶
$buckets = [];
for ($i = 0; $i < $n; $i++) {
$buckets[$i] = [];
}
// 将每个元素放入桶
for ($i = 0; $i < $length; $i++) {
$index = ceil(($arr[$i] - $min) / $length);
$buckets[$index][] = $arr[$i];
}
// 对每个桶进行排序
$res = [];
for ($i = 0; $i < $n; $i++) {
sort($buckets[$i]);
// 合并所有桶中的元素
$res = array_merge($res, $buckets[$i]);
}
return $res;
}

$arr = [12, 31, 85, 7, 41, 34, 10, 96];
$res = bucketSort($arr);
print_r($res);

这种方法,只需要设置12个桶即可,大大的节省了空间。

转载于:https://www.cnblogs.com/lovezbs/p/11131284.html

数据结构与算法之PHP排序算法(桶排序)相关推荐

  1. 算法与数据结构07:前缀树,计数排序与桶排序

    算法与数据结构07:前缀树,计数排序与桶排序 前缀树 计数排序 桶排序 前缀树 Trie 1.根据字符串数组中,每个字符串的字符作为路径,组成而成的一个多叉树结构 2.每个节点都有一个paths数组, ...

  2. 数据结构与算法学习--排序(桶排序,计数排序,基数排序)

    基数排序和计数排序可以参照链接 桶排序: 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递 ...

  3. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  4. 十大排序算法详解(二)归并排序、堆排序、计数排序、桶排序、基数排序

    文章目录 一.归并排序 1.1 归并排序基础[必会知识] 1.1.1 递归实现 1.1.2 非递归实现 1.2 归并排序优化 1.2.1 小数组使用插入排序 1.2.2 避免多余比较 1.2.3 节省 ...

  5. [转载] 令牌桶算法和漏桶算法python_排序算法(七):Bucket Sort 桶排序

    参考链接: 用Python进行存储桶Bucket Sort排序 Couting Sort 计数排序虽然快,但其只能对整数进行排序有一点的局限性.而 Bucket Sort 桶排序则没有这个限制.这里我 ...

  6. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

  7. 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid

    三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...

  8. javascript算法排序之桶排序

    ​ ​ 活动地址:CSDN21天学习挑战赛 前言 经典的排序算法,很多人都听过,很多人也许用过,但是也有很多人,听过没见过.为什么呢?现在我们有了越来越多的框架.依赖包,我们将能用到排序的实际场景,作 ...

  9. [数据结构][Python]鸡尾酒排序、桶排序

    鸡尾酒排序: #!/usr/bin/python def _cocktail_sort(the_list):the_len = len(the_list)if the_len <2:#0和1pr ...

  10. 八十五、再探希尔排序,桶排序,计数排序和基数排序

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 关于排序,其实还有很多,比如常见的希尔排序,桶排序,计数排序和基数排 ...

最新文章

  1. 开工了!三位大咖给你指路:未来 3~5 年内,哪个方向的机器学习人才最紧缺?
  2. HUMAnN2:人类微生物组统一代谢网络分析2
  3. 《从零构建前后分离web项目》:开篇 - 纵观WEB历史演变
  4. VisualStudioCode插件下载
  5. Matlab循环读取txt文件并对其中数据进行计算最后导出为excel
  6. 深度学习中常用的激活函数详解及对比分析(sigmoid)
  7. jdk12 jdk1.8_JDK 12的Files.mismatch方法
  8. 蓝桥杯 基础练习 数列排序
  9. php 苹果支付验证,PHP实现Apple应用内购服务端验证
  10. 4x4矩阵键盘扫描c语言程序,技巧:C语言超经典矩阵键盘连接,流程图和扫描程序...
  11. 隐藏手机号码中间四位程序python_Excel快速将手机号码中间四位数字隐藏
  12. linux下 fat32转ntfs,NTFS和FAT32区别和转换
  13. git Pull Request 是什么意思?
  14. 如何关闭计算机服务检测,电脑知识:Win7系统如何关闭交互式服务检测窗口?...
  15. 40岁男人娶20岁女孩
  16. JAVA对接短信通知接口
  17. 加油吧 少年(人生建议)
  18. 计算机中级职称能转评讲师,职称评审中的转评问题
  19. Linux入门和使用
  20. 如何彻底禁止一般无法彻底禁止的云上输入法等的广告

热门文章

  1. 【转载】一份不可多得的深度学习技巧指南
  2. 使用scrapy-redis构建简单的分布式爬虫
  3. java 注解开发 解耦_Android java 解耦框架注解Dagger2
  4. mysql number decimal_Oracle中的decimal与Number区别
  5. web操作日志丢失_日志异步落库,你了解不
  6. 基于vue+node的校园交流平台
  7. Java基础总结04-数组
  8. ubuntu 20 /CentOS 8.x/MAC 系统 中安装GO LANG(GO语言)
  9. ubuntu 17.x/CentOS 7.x中安装JAVA JDK
  10. 阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门