常用排序算法之桶排序

说明:本文部分内容借鉴《啊哈!算法》,如有版权问题,请联系jouzeyu@163.com

前言:什么是桶排序

  桶排序其实就是一种归纳排序,他将要进行排序的数组分到有限的桶里面,然后对桶进行归纳排序,可以理解成他是一个归纳结果。

案例,来自《啊哈!算法》

小哼的班上只有 5 个同学,这 5 个同学分别考了 5 分、3 分、 5 分、2 分和 8 分,哎考得真是惨不忍睹(满分是 10
分)。接下来将分数进行从小到大排序, 排序后是 2 3 5 5 8。

思路分析

  首先,他的总分是10分,也就是说有11种情况,所以我们需要11个桶,开始的时候我们都不给这些桶加水,也就是每个桶是0,每个桶都标号从0开始到10结束。

  然后呢我们可以看到有5个同学,所以,我们可以通过循环拿到这五个同学的分数,拿到分数后,比如我先拿到的是8分,那么我们就给标号为8的桶加1刻度水(当然也不一定是刻度为单位,也可以是升,毫升什么的,这里是方便理解),这样下来,标号为2的桶里有1刻度水,标号为3的桶里有1刻度水,标号为5的桶里有2刻度水,标号为8的桶里有1刻度水。

  最后,我们对这些桶里面的水进行统计,从前往后,有一刻度水的就打印这个桶编号1次,两刻度水的就打印桶编号2次

原代码实现

#include <stdio.h>
int main()
{
     int a[11],i,j,t;
     for(i=0;i<=10;i++)
     a[i]=0; //初始化为0

     for(i=1;i<=5;i++) //循环读入5个数
     { 
         scanf("%d",&t); //把每一个数读到变量t中
         a[t]++; //进行计数
     }
     for(i=0;i<=10;i++) //依次判断a[0]~a[10]
     for(j=1;j<=a[i];j++) //出现了几次就打印几次
     printf("%d ",i);
     getchar();getchar();
     //这里的getchar();用来暂停程序,以便查看程序输出的内容
     //也可以用system("pause");等来代替
     return 0;
}

这个是Java的实现过程,但是我平时用的是PHP,那么PHP的实现代码是什么样子的呢?

 public function index()
    {
        //需要进行排序的数组
        $arr = array(5, 3, 5, 2, 8);
        //声明一个空数组
        $list = array();
        //将空数组赋值0
        for ($i = 0; $i <= 10; $i++) {
            $list[$i] = 0;
        }
        //按照相应的进行重新赋值
        for ($j = 0; $j < sizeof($arr); $j++) {
            $list[$arr[$j]]++;
        }
        //打印排序后的结果
        for ($i = 1; $i <= 10; $i++) {
            for ($j = 1; $j <= $list[$i]; $j++) {
                var_dump($i);
            }
        }
    }

  其实差不了多少,只不过语法不同,精简了少部分代码,因为没有深入研究java的关系,没搞明白那5个数字怎么输入进去,所以定义了一个需要排序的数组,第一个for循环分配了所需要的桶,第二个for循环相当于给桶里面加水,第三个for循环相当对输出,你,了解了吗?

如有不对的地方,欢迎留言指正!

本作品采用《CC 协议》,转载必须注明作者和本文链接
空舟湖上~      ——Jouzeyu
lochpure
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

有点意思,不过这个桶排序只适用于要排序的数相差不大的情况,否则内存占用太大了,简单点来说这个算法就是空间换时间

4年前 评论
$data = [5,3,5,2,8];
$count = array_count_values($data);
$res = [];
for ($i = 0; $i < 11; $i++) {
    if (isset($count[$i])) {
        for ($j = 0; $j < $count[$i]; $j++) {
            $res[] = $i;
        }
    }
}
print_r($res);
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!