A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

最近看了一篇文章,讲的是桶排序的算法,不过文章主人是用C++实现的,于是就想能不能用java实现一下,下面是部分原文内容和我的java代码,写的比较简单,有什么意见和想法欢迎大家提出来交流交流。
先举个栗子介绍一下桶排序的思想
期末考试完了老师要将同学们的分数按照从高到低排序。小明的班上只有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分每个分数出现的次数。接下来,我们只需要将出现过的分数打印出来就可以了,出现几次就打印几次,具体如下:
[backcolor=rgb(238, 238, 238) !important]

最终屏幕输出“2 3 5 5 8”,完整的代码如下。





36 个回复

倒序浏览
冒泡排序
回复 使用道具 举报
妥妥的冒泡排序
回复 使用道具 举报
本帖最后由 Wanibal 于 2016-5-3 20:24 编辑

桶排序的时间复杂度为O(m+n)。m为桶的个数,n为待排序数的个数冒泡排序的时间复杂度是O(n2)
回复 使用道具 举报

完全不一样的啊
回复 使用道具 举报
方法不错,不知道在随机值范围较大的情况下,有没有什么弊端
回复 使用道具 举报
某些地方确实是不错不过总感觉有点弊端,才刚开始学,也说不上来。

点评

嗯,感觉挺准的,这个算法比较适合数字比较集中的情况  发表于 2016-5-3 20:52
回复 使用道具 举报
布德鸟 发表于 2016-5-3 20:25
方法不错,不知道在随机值范围较大的情况下,有没有什么弊端

是啊,缺点就是随机值分布范围比较大的话,就非常占用内存空间了
回复 使用道具 举报
冒泡排序
回复 使用道具 举报
设计的挺好的,只不过包我们还没学,嘿嘿,其他都简单,就差一个打包过程
回复 使用道具 举报
嗯嗯,看起来是是这样的
回复 使用道具 举报
万一整数比较大呢
回复 使用道具 举报
感谢分享啊,学习一下。
回复 使用道具 举报
这个不错,支持一下啊
回复 使用道具 举报

冒泡排序
回复 使用道具 举报
加油加油加油加油加油
回复 使用道具 举报
学习了{:2_30:}
回复 使用道具 举报
66666666666666666666666
回复 使用道具 举报
我记的使用c实现的不是C++
回复 使用道具 举报
完全看不懂,   你不会出现角标越界?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马