Java算法 “桶排序”

Posted 动力节点Java学院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java算法 “桶排序”相关的知识,希望对你有一定的参考价值。

在生活中年龄的大小、身材的高矮、体重的胖瘦、收入的多少、颜值的高低,都可以通过数据统计或评测给出排序结果,在某种意义上排序也是人和人区别的一种体现,而在Java语言中排序也回去经常遇到算法排序的问题,怎么样用程序实现数据 快速排序呢?下面就来给大家介绍一种相对简单的方法——“桶排序”。
 

考试成绩排名是老师经常干的事情,我们就以期末考试成绩排序为例,来讲解“ 桶排序”。

小哼班上只有5个同学,这次期末考试的成绩分别是5分、3分、5分、2分和8分,这成绩真是惨不忍睹(因为满分是10分)。下面我们就把考试成绩从高到低进行排序, 结果是:8 5 5 3 2
 
现在你要思考一下你有什么好的编写方法,能够实现时机输入的5个数能够从大到小输出?

认真思考15分钟
……………..
 
然后接着看

其实解决这个问题很简单,借助一个一维数组就可以。
方法如下:

先来申请一个大小为11的数组 int a[11],设定好后你就拥有了 10个变量,我们把它们进行编号从 a[0]——a[1 0],为了表示它们从未有人得过这个分数, 我们把这10个变量都初始化为0,如a[0]=0表示目前没有人得过0分,同样a[3]=0就表示目前没有人得过3分……a[10]=0表示目前没人得过10分。

Java算法 “桶排序”

下面开始“翻牌子”处理这些分数吧~ 第一个同学的分数是5分,就把a[5]的值在原基础上加1, 现在a[5]的值是1,就表示这个5分出现过一次了。
Java算法 “桶排序”

第二个分数是3分,我们就把a[3]相对应的从0改成1 ,表示3分也出现过一次了。
Java算法 “桶排序”

接下来又是一个5分,我们只需要在现基础上在加1,表示5分又出现了一次,现在a[5]的值是2
Java算法 “桶排序”


按照上边的方法来处理接下来的两个分数,分别是2分和8分
最后的结果就是这样啦~
Java算法 “桶排序”


通过以上的操作,或许你已经发现了 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”,完整的排序代码如下:
Java算法 “桶排序”
输入的数据是:
5 3 5 2 8

认真的思考的小伙伴一定发现了,我们刚才做的排序是从小到大的,现在要求的是要我们从大到小排序, 那要怎么办呢?

再思考一会儿
 .................
接下来我们接着看

这个也很简单, 你只需要将
for(i=0;i<=10;i++)改为for(i=10;i>=0;i--)就可以实现啦!
这种排序方法我们暂且称之为,桶排序,实际上真正的桶排序比这要复杂一些,以后再详细介绍,目前这个方法就可以满足初学需要了。

Java算法 “桶排序”

这种算法就好比是有0—10共11个木桶,每当出现一数,就在于其相对于的木桶里放一面小旗子,我们上边的例子中,编号是5的木桶里一共放了两面小旗子,表示5出现过两次,,编号是2的木桶里放1面小旗子,表示2出现过一次,编号是3的木桶里放一面小旗子,表示3出现过一次,编号是8的木桶里放一面小旗子,表示8出现过一次。
Java算法 “桶排序”

Java算法 “桶排序”


下面你也可以自己做个练习,在0—1000之前任意取n个整数,并将它们从小到大排序。

在这要特别提醒一下你:0—1000之前进行排序,我们需要的是 1001个木桶,不是1000个,这个一定要注意。木桶是为了帮助你的理解, 其实际的作用就是“标记”每个数字出现的次数,所以在编程中我们更习惯将之前数字的a替换成book,book单词有记录、标记的意思), 代码实现如下:
Java算法 “桶排序”
你也可以输入数据验证一下

10
8 100 50 22 15 6 1 1000 999 0
运行结果是
1000 999 100 50 22 15 8 6 1 0

Java算法 “桶排序”

桶排序从1956年就开始应用了,排序基本思想是由E.J.Issac  R.C.Singleton提出来。在上边我们说过,刚才的实例算不上真正意义的 桶排序,我们也可以称它是简化版的 桶排序,真正的 桶排序要比这个更加复杂,在最开始接触我们就一步一步来,从简单到难慢慢积累。

延伸阅读:之所以说他它算不上真正意义上的 桶排序,因为在遇到一些问题这种简单的算法可能解决不了:比如现在分别有5位学生的名字和分数:gaga5分、hehe3分、zizi5分、xixi2分和xueba8分。下面请按照分数从高到底进行排序,并输出他们的名字。你输入这5个人的名字后是不是发现问题了?如果我们采用简化版的 桶排序法,仅仅解决的是分数排序,最后输出的也只能是分数,但对人本身没有进行排序,所以我们无法知道与每一个分数相对应的是哪一个人!这个问题要怎么解决呢?大家先把今天的内容消化了,以后再详细介绍。


关注公众号  回复 “二维码” 获取谢老师微信添加即可免费领取 Java全套自学教程(添加老师微信请备注:最新教程)

关注我们
学Java更简单
点击左下方蓝色 阅读全文  10个Java学习小计划  

以上是关于Java算法 “桶排序”的主要内容,如果未能解决你的问题,请参考以下文章

用Java实现桶排序算法

挑战程序设计竞赛(算法和数据结构)——7.4计数排序(桶排序)的JAVA实现

十大经典排序算法最强总结(含Java代码实现)

基数排序算法的Java实现

八大排序算法Java(转)

java实现桶排序