排序算法-桶排序(入门级别)
我们这里只需借助一个一维数组就可以解决这个问题。请确定你真的仔细想过再往下看哦。
首先我们需要申请一个大小为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分。
#include <stdio.h>
int main()
{int a[11],i,j,t;for(i=0;i<=10;i++)a[i]=0; //初始化为0for(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啦,快去试一试吧。
这种排序方法我们暂且叫他“桶排序”。因为其实真正的桶排序要比这个复杂一些,以后再详细讨论,目前此算法已经能够满足我们的需求了。
#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。发现问题了没有?如果使用我们刚才简化版的桶排序算法仅仅是把分数进行了排序。最终输出的也仅仅是分数,但没有对人本身进行排序。也就是说,我们现在并不知道排序后的分数原本对应着哪一个人!这该怎么办呢?不要着急请听下回——冒泡排序。
排序算法-桶排序(入门级别)相关推荐
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 疯子的算法总结(六) 复杂排序算法 ② 桶排序
从<基于比较的排序结构总结 >中我们知道:全依赖"比较"操作的排序算法时间复杂度的一个下界O(N*logN).但确实存在更快的算法.这些算法并不是不用"比较& ...
- 排序算法----桶排序(java版)
桶排序 桶排序(Bucket Sort)顾名思义,会用到"桶",我们可以将其想象成一个容器,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序.桶内排完序之后 ...
- 排序算法----桶排序(数组)
桶排序是一种效率很高的排序算法,它的时间复杂度为O(N+M),(N个元素,范围为0--M),但桶排序有一定的限制,必须为非负整数,而且元素不宜过大. 算法思想: 设待排序序列的元素取值范围为0到m,则 ...
- 十大经典排序算法—桶排序
1.算法思想: 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量 使用的映 ...
- JavaScript算法——桶排序
一.桶排序的原理 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.思路大致是, 设置一个定量的数组当作空桶: 遍历输入数据,并且把数据一个一个放到对应的桶里去 ...
- JavaScript实现十种经典排序算法(js排序算法)
冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-希尔排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序
冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...
最新文章
- 企业架构-发布【企业架构框架-TOGAF v0.1.pdf】
- 小白入门深度学习 | 第四篇:配置PyTorch环境
- python stdout stderr 一起输出_Python在保留顺序的同时分别从子进程stdout和stderr读取...
- java字符连接字符串数组_Java中连接字符串的最佳方法
- java if else重构_java – 如何重构这个有多个if / else语句的方法
- 阿里巴巴的AI算法程序媛是怎样的一种存在?
- python无限循环的关键字_零基础学python-12.2 关键字pass,else,break,continue
- 程序员6年换了8份工作,工资从4.5K涨到40K,网友问:谁敢要你?
- window系统对应默认IE浏览器版本
- AirFlow常见问题汇总
- 日常赠书 | 王者荣耀的觉悟AI是怎么训练的?
- python install pip 区别_pip install和python -m pip install有什么区别?
- DNN训练技巧(Tips for Training DNN)
- 基于springboot的考研学习平台
- (转)我40个比特币失而复得的经历
- SQL LIKE通配符 模糊查询
- Java对象转Map
- 2018厦门大学计算机技术分数线,2018厦门大学专业排名及分数线 王牌专业有哪些...
- 【VMware】虚拟机中映射USB设备
- MapGuide空间参考系API
热门文章
- 卸载列表信息——Uninstall注册表
- vue引入bootstrap.min.css报错:Cannot find module ./assets/css/bootstrap.min.css
- [转]Ubuntu的root密码是什么
- 【转】解密微软的架构师之路
- 全新起航,无悔青春-嵌入式19031开班典礼
- 手撕代码合集[短期更新]
- Codeforces.741D.Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree 思路)
- JavaScript基础(三)
- SignalR 服务器系统配置要求
- Linux/Windows 文件交互读取转义字符变换