最快最简单的排序——桶排序

【C】PTA期末分数排序(归并排序) 考试结束了,全班同学的分数都出来了。老师需要对分数做一次排序,看看从高到低,分数的排列是怎样的。 输入格式: 第一行是一个n,表示班级同学的人数,1<=n<=500000。 第二行开始有n个分数,0<=分数<=100,分数都是整数,没有零点五分。 输出格式: 输出排序后的分数,按照从大到小排列,相同的分数排在一起,每两个分数之间间隔一个空格。 输入样例: 10... 阅读详情

https://blog.youkuaiyun.com/ahalei/article/details/19825419

最快最简单的排序——桶排序
 

  在我们生活的这个世界中到处都是被排序过的。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东西都需要排序,可以说排序是无处不在。现在我们举个具体的例子来介绍一下排序算法。
 
 
  首先出场的我们的主人公小哼,上面这个可爱的娃就是啦。期末考试完了老师要将同学们的分数按照从高到低排序。小哼的班上只有5个同学,这5个同学分别考了5分、3分、5分、2分和8分,哎考的真是惨不忍睹(满分是10分)。接下来将分数进行从大到小排序,排序后是8 5 5 3 2。你有没有什么好方法编写一段程序,让计算机随机读入5个数然后将这5个数从大到小输出?请先想一想,至少想15分钟再往下看吧(*^__^*) 。

 
  我们这里只需借助一个一维数组就可以解决这个问题。请确定你真的仔细想过再往下看哦。
 
  首先我们需要申请一个大小为11的数组int a[11]。OK现在你已经有了11个变量,编号从a[0]~a[10]。刚开始的时候,我们将a[0]~a[10]都初始化为0,表示这些分数还都没有人得过。例如a[0]等于0就表示目前还没有人得过0分,同理a[1]等于0就表示目前还没有人得过1分……a[10]等于0就表示目前还没有人得过10分。

 

  下面开始处理每一个人的分数,第一个人的分数是5分,我们就将相对应a[5]的值在原来的基础增加1,即将a[5]的值从0改为1,表示5分出现过了一次。


  第二个人的分数是3分,我们就把相对应a[3]的值在原来的基础上增加1,即将a[3]的值从0改为1,表示3分出现过了一次。


  注意啦!第三个人的分数也是“5分”,所以a[5]的值需要在此基础上再增加1,即将a[5]的值从1改为2。表示5分出现过了两次。


  按照刚才的方法处理第四个和第五个人的分数。最终结果就是下面这个图啦。

 
  你发现没有,a[0]~a[10]中的数值其实就是0分到10分每个分数出现的次数。接下来,我们只需要将出现过的分数打印出来就可以了,出现几次就打印几次,具体如下。
  a[0]为0,表示“0”没有出现过,不打印。
  a[1]为0,表示“1”没有出现过,不打印。
  a[2]为1,表示“2”出现过1次,打印2。
  a[3]为1,表示“3”出现过1次,打印3。
  a[4]为0,表示“4”没有出现过,不打印。
  a[5]为2,表示“5”出现过2次,打印5 5。
  a[6]为0,表示“6”没有出现过,不打印。
  a[7]为0,表示“7”没有出现过,不打印。
  a[8]为1,表示“8”出现过1次,打印8。
  a[9]为0,表示“9”没有出现过,不打印。
  a[10]为0,表示“10”没有出现过,不打印。
  最终屏幕输出“2 3 5 5 8”,完整的代码如下。
#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;
}


      输入数据为
5 3 5 2 8 

      仔细观察的同学会发现,刚才实现的是从小到大排序。但是我们要求是从大到小排序,这该怎么办呢?还是先自己想一想再往下看哦。
 
  其实很简单。只需要将for(i=0;i<=10;i++)改为for(i=10;i>=0;i--)就OK啦,快去试一试吧。
 
  这种排序方法我们暂且叫他“桶排序”。因为其实真正的桶排序要比这个复杂一些,以后再详细讨论,目前此算法已经能够满足我们的需求了。
 
  这个算法就好比有11个桶,编号从0~10。每出现一个数,就将对应编号的桶中的放一个小旗子,最后只要数数每个桶中有几个小旗子就OK了。例如2号桶中有1个小旗子,表示2出现了一次;3号桶中有1个小旗子,表示3出现了一次;5号桶中有2个小旗子,表示5出现了两次;8号桶中有1个小旗子,表示8出现了一次。
 
 
  现在你可以请尝试一下输入n个0~1000之间的整数,将他们从大到小排序。提醒一下如果需要对数据范围在0~1000之间的整数进行排序,我们需要1001个桶,来表示0~1000之间每一个数出现的次数,这一点一定要注意。另外此处的每一个桶的作用其实就是“标记”每个数出现的次数,因此我喜欢将之前的数组a换个更贴切的名字book(book这个单词有记录、标记的意思),代码实现如下。
#include <stdio.h>
int main()
{
    int book[1001],i,j,t,n;
    for(i=0;i<=1000;i++)
        book[i]=0; 
    scanf("%d",&n);//输入一个数n,表示接下来有n个数
    for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序
    {
        scanf("%d",&t);  //把每一个数读到变量t中
        book[t]++;  //进行计数,对编号为t的桶放一个小旗子
    }
    for(i=1000;i>=0;i--)  //依次判断编号1000~0的桶
        for(j=1;j<=book[i];j++)  //出现了几次就将桶的编号打印几次
             printf("%d ",i);
 
    getchar();getchar();
    return 0;
}
  可以输入以下数据进行验证
10
8 100 50 22 15 6 1 1000 999 0
  运行结果是
1000 999 100 50 22 15 8 6 1 0

  最后来说下时间复杂度的问题。代码中第6行的循环一共循环了m次(m为桶的个数),第9行的代码循环了n次(n为待排序数的个数),第14和15行一共循环了m+n次。所以整个排序算法一共执行了m+n+m+n次。我们用大写字母O来表示时间复杂度,因此该算法的时间复杂度是O(m+n+m+n)即O(2*(m+n))。我们在说时间复杂度时候可以忽略较小的常数,最终桶排序的时间复杂度为O(m+n)。还有一点,在表示时间复杂度的时候,n和m通常用大写字母即O(M+N)。

  这是一个非常快的排序算法。桶排序从1956年就开始被使用,该算法的基本思想是由E.J.Issac  R.C.Singleton提出来。之前说过,其实这并不是真正的桶排序算法,真正的桶排序算法要比这个更加复杂。但是考虑到此处是算法讲解的第一篇,我想还是越简单易懂越好,真正的桶排序留在以后再聊吧。需要说明一点的是:我们目前学习的简化版桶排序算法其本质上还不能算是一个真正意义上的排序算法。为什么呢?例如遇到下面这个例子就没辙了。

  现在分别有5个人的名字和分数:huhu 5分、haha 3分、xixi 5分、hengheng 2分和gaoshou 8分。请按照分数从高到低,输出他们的名字。即应该输出gaoshou、huhu、xixi、haha、hengheng。发现问题了没有?如果使用我们刚才简化版的桶排序算法仅仅是把分数进行了排序。最终输出的也仅仅是分数,但没有对人本身进行排序。也就是说,我们现在并不知道排序后的分数原本对应着哪一个人!这该怎么办呢?不要着急请听下回——冒泡排序。
 
码字不容易啊,转载请标明出处^_^
【一周一算法】算法1:最快最简单的排序——桶排序
http://blog.youkuaiyun.com/ahalei/article/details/19825419
--------------------- 
作者:啊哈磊 
来源:优快云 
原文:https://blog.youkuaiyun.com/ahalei/article/details/19825419 
版权声明:本文为博主原创文章,转载请附上博文链接!

入门算法之最快最简单的排序:桶排序 桶排序算法是最简单最快速的排序算法,今天我们先从最简单的开始接触算法,首先我们先看下代码实现,然后根据结果再来对该算法进行分析: public class BucketSort { public static void main(String[] args) { // 1.等待排序的数组 int[] waitNumbers = {3,15,8,13,6,35}; // 2.准备好空桶 (带排序数字中最大的那个值+1) ... 阅读详情

相关推荐

C语言桶排序算法详解及示例代码

桶排序(Bucket Sort)是一种排序算法,它将待排序的元素分配到不同的桶(buckets)中,每个桶内的元素再分别进行排序。桶排序的基本思想是将数据分散到多个桶中,使得每个桶中的数据范围尽可能小,然后对每个桶中的数据进行排序,最后按照桶的顺序将数据合并起来。然后,我们遍历输入数组,根据元素的大小将其分配到对应的桶中。对每个桶中的元素进行排序:可以使用任何适合的排序算法对每个桶中的元素进行排序,例如插入排序、快速排序等。合并桶中的元素:按照桶的顺序依次将每个桶中的元素合并起来,形成最终的有序序列。

DevGOOD的博客 463

十大排序算法-桶排序(c语言实现)

或所谓的,是一个,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的或是以递归方式继续使用桶排序进行排序)把待排序序列中的数据根据函数映射方法分配到若干个桶中,在分别对各个桶进行排序,最后依次按顺序取出桶中的数据。适用于数据分配均匀,数据比较大,相对集中的情况。简单来说就是把数据按分类,每一个类放进一个容器(箱子)中,然后用其他排序方法对每个容器中的数据排序,最后再按分配方法产生的顺序依次取出数据。.........

qq_57018268的博客 6571

从逻辑门到RISC-V指令:ALU设计实战与Verilog实现

本文详细介绍了从逻辑门到RISC-V指令集的ALU设计实战与Verilog实现方法。通过构建1位ALU并扩展至64位,深入解析了RISC-V指令集的算术逻辑单元实现技巧,包括加法器设计、零标志检测和溢出检测等关键功能。文章还分享了Verilog代码优化、流水线设计和常见问题调试的实用经验,为开发者提供了一套完整的ALU设计解决方案。

weixin_29214335的博客 184

基数排序(桶排序)——C语言实现

文章目录一、基数排序二、排序思想三、动图演示四、图解五、代码实现(包含详细注释)六、问题解答七、致命缺陷(负数问题) 一、基数排序 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,在某些时候,基数排序法的效率高于其它的稳定性排序法。 二、排序思想 基数排序就是桶排序,也可以说是桶排..

qq_41890240的博客 1万+

小新学习K8s第一天之K8s基础概念

kubernetes是一个可移植,可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明式配置和自动化。它拥有庞大且快速发展的生态系统。kubernetes服务,支持和工具随处可见。作用:用于自动部署,扩展和管理“容器化应用程序”的开源系统。可以理解成k8s是负责自动化运维管理多个容器化程序(比如docker)的集群,是一个生态及其丰富的容器编排框架工具。

pangdongqiqi的博客 1226

大疆航线文件解析指南:5分钟搞懂KMZ里的template.kml和waylines.wpml区别

本文深入解析大疆无人机航线文件KMZ中template.kml与waylines.wpml的核心区别。template.kml是定义任务框架和全局参数的可编辑模板,而waylines.wpml是包含精确执行指令的最终文件。理解两者差异对于高效规划航线、批量生成任务及进行二次开发至关重要。

sun99的博客 864

C语言经典算法之桶排序算法

桶排序(Bucket Sort)是一种非比较型整数排序算法,它将要排序的数据分到有限数量的“桶”里,每个桶内的数据再单独进行排序。最终,通过收集每个桶里的排序结果并合并在一起得到最终的有序序列。桶排序假设输入是由一个随机过程生成的,并且期望能够在一定条件下获得线性时间复杂度。

weixin_56154577的博客 2422

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3295

桶排序——最快最简单排序

排序现象随处可见,考试名次、身高排序、年龄排序、网上购物价格排序、用户访问时间排序等等。 自己在刷leetcode数组简单算法题中遇到题目如下: 此题可以有多种解法,但其中的桶排序是最快最简单有效的 解法一:桶排序法 public int heightChecker(int[] heights) { // 值的范围是1 <= heights[i] <= 100,因此需要1,2,3,...,99,100,共101个桶 int[] arr = new int[10

发子鸡的博客 1283

4D 毫米波雷达:智驾普及的新路径(一)

总体而言,4D 毫米波雷达具有更佳的探测能力,更高的分辨率和精度,在人工智能技术的加持下,能够实现更加智能化的感知和跟踪,从而为自动驾驶、智能交通等领域提供更加可靠的数据支持。博世的第五代引入了俯仰维度,但其角度分辨率较差,且最大探测距离为。车载毫米波雷达的尺寸受限,我们认为通过算法的优化、天线内置等方式可以在保障性能的前提下,压缩尺寸,便于车企进行灵活的设计安装。在物理设计、天线性能设计、电连接、封装工艺和材料、散热处理、可靠性与自动化测试等方面进行持续优化,推出可大规模量产的高性能毫米波雷达解决方案。

奔袭的算法工程师 3953

深入理解 HTTP 协议中的 Content-Type

是 HTTP 协议中的一个头部字段(Header),用于指示请求或响应中实体主体(body)的媒体类型(Media Type),也称为MIME 类型(Multipurpose Internet Mail Extensions)。

h a 6 6 6 c k 为 你解决复杂难题! 997

桶排序--最快最简单的排序

站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……

扬起你的笑脸~把影子藏在身后 1882

Python FastAPI 面试题及参考答案

FastAPI 的路由机制是其核心功能之一,用于将不同的 URL 路径映射到相应的处理函数。通过定义路由,可以构建出功能丰富的 API。在 FastAPI 中,使用装饰器来定义路由。在这个示例中,是一个装饰器,它将根路径"/"的 GET 请求映射到read_root函数。当客户端发送一个 GET 请求到根路径时,FastAPI 会调用read_root函数并返回结果。

大模型大数据攻城狮的专栏 2244

【最快最简单的排序 —— 桶排序算法】

桶排序算法是一种基于计数的排序算法,适用于特定的数据分布情况。其效率受到数据分布、桶的数量和桶内排序算法的选择等因素的影响。在 C++和 Python 中都有相应的实现方法,通过分析这些代码示例,可以更好地理解桶排序算法的原理和应用。

weixin_45498884的博客 1112

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

最快最简单的排序—桶排序

我们学过很多的排序方法,冒泡排序、希尔排序、快速排序……今天我想说的是一种应用起来最快最简单的排序——桶排序。当你随机输入几个数,进行从小到大(从大到小)依次排序;你会有什么方法? 这里只需一个一维数组即可。申请一个长度为n的一维数组。就相当于定义n个变量arr[0]~arr[n-1]; 刚开始都初始化为0,表示没有任何东西使用它。下来我们将某个数字对应的数组下表的数组的值增加1。即arr[0]=

每天学习一点点,成长一小步 1704

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最快、最简单的排序算法——桶排序

什么是桶排序桶排序,也叫做箱排序,是一种排序算法,也是排序算法中最快、最简单的排序算法。其中的思想是我们首先要知道所有待排序的范围,然后需要有在这个范围的同样数量的桶,接着把元素放到对应的桶中,最后按顺序输出。这时间上是简易版的桶排序,试想一下,如果要排序的范围是0-100万,使用桶排序方法进行排序,那么我们要准备100万个桶,这显然对于计算机的开销肯定很大,所以,桶排序在有这时间最快的优势,同时...

kuangsonghan的博客 1352

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

最快最简单的排序-桶排序

桶排序 期末考试完了老师要将同学们的分数按照从高到低排序。满分10分,班上有5个同学,这5个同学分别考了5分、3分、5分、2分和8分。接下来将分数进行从大到小排序,排序后是8 5 5 3 2。 我们这里只需借助一个一维数组就可以解决这个问题。 首先我们需要申请一个大小为11的数组int a[11]。编号从a[0]a[10]。刚开始的时候,我们将a[0]a[10]都初始化为0,表示这些分数还都没有人...

Mk_kkkk的博客 809

【算法】最快最简单的排序——桶排序

本文出自 “啊哈磊” 博客,请务必保留此出处 http://ahalei.blog.51cto.com/4767671/1362789 在我们生活的这个世界中到处都是被排序过的。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东西都需要排序,可以说排序是无处不在。现在我们举个具体的例子来介绍一下排序算法。...

Twinkle 1万+
上一篇: 快速排序
下一篇: 深入探索spring技术内幕(七): 配置Spring AOP面向切面编程
god_love_hlq_xff
博客等级 码龄11年 27粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值