Java算法实现之桶排序
来源:互联网 发布:网络聊天软件 编辑:程序博客网 时间:2024/06/16 06:29
桶排序,网上也称之为计数排序,是一种非常简单、效率很高(空间换时间)的“投机取巧”算法。
先来一个demo:
期末考试完了老师要将同学们的分数按照从高到低排序。小哼的班上只有5个同学,这5个同学分别考了5分、3分、5分、2分和8分,哎考的真是惨不忍睹(满分是10分)。接下来将分数进行从小到大排序,排序后是2 3 5 5 8。你有没有什么好方法编写一段程序,让计算机随机读入5个数然后将这5个数从小到大输出?
首先我们需要申请一个大小为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分每个分数出现的次数。接下来,我们只需要将出现过的分数打印出来就可以了,出现几次就打印几次,具体代码如下:
//班上只有5个同学,这5个同学分别考了5分、3分、5分、2分和8分,哎,考得真是惨不忍睹(满分是10分)public class Bucket01 {public static void main(String ars[]){int score[] = {5,3,5,2,8};//实际分数int bucket[] = new int[11];//建立"桶"for (int i = 0; i < score.length; i++) {bucket[score[i]]++;//把分数放到桶里面}for (int i = 0; i < bucket.length; i++) {while(bucket[i] != 0){//按顺序输出桶中的分数System.out.print(i + " ");bucket[i]--;}}}}
举一反三:
1、输入0-1000的整数,进行桶排序
代码如下:
//输入10个0-1000的整数,进行桶排序public class Bucket02 {public static void main(String args[]){int num[] = {139,999,20,60,4,80,90,400,684,0};//模拟输入int bucket[] = new int[1001];//建立"桶"for (int i = 0; i < num.length; i++) {bucket[num[i]]++;}for (int i = 0; i < bucket.length; i++) {while(bucket[i] != 0){System.out.print(i + " ");bucket[i]--;}}}}
2、输入0-100的整数,去重并排序
代码如下:
//0-100去重并排序public class Bucket03 {public static void main(String ars[]) {int num[] = {1,56,24,36,56,42,1,5,6,8};// 模拟目标数组int bucket[] = new int[101];//建立"桶"for (int i = 0; i < num.length; i++) {if (bucket[num[i]] == 0)// 去重,只加一次bucket[num[i]]++;}for (int i = 0; i < bucket.length; i++) {if (bucket[i] != 0)//输出桶内容System.out.print(i + " ");}}}
算法复杂度:代码中只需两个for循环,所以算法复杂度为:O(M+N)。
只记录了值却未记录址。比如现在分别有5个人的名字和分数:huhu 5分、haha 3分、xixi 5分、hengheng 2分和gaoshou 8分。请按照分数从高到低,输出他们的名字。即应该输出gaoshou、huhu、xixi、haha、hengheng。所以该算法无法实现。
- 桶排序算法之Java实现
- Java算法实现之桶排序
- Java算法实现之桶排序
- Java实现排序算法之
- Java实现排序算法之堆排序
- Java实现排序算法之快速排序
- Java实现排序算法之归并排序
- java实现排序算法之堆排序
- Java实现排序算法之冒泡排序
- 排序算法之快速排序 Java实现
- 排序算法之插入排序 Java实现
- java实现排序算法之冒泡排序
- 排序算法之快速排序java实现
- 排序算法之堆排序java实现
- 排序算法之归并排序java实现
- 排序算法之堆排序 Java 实现
- 排序算法之希尔排序 java实现
- 算法 排序算法之计数排序 java实现
- 数据结构与算法--链表(1)
- 开源大数据处理工具汇总(上)
- 启动tomcat的时候就报错“Server Tomcat v7.0 Server at localhost failed to start.”
- instancetype
- Apache最大连接数/apache并发数修改方法
- Java算法实现之桶排序
- Task async/await
- Android布局性能调优
- SpringMVC详细示例实战教程
- 《信息系统项目管理师考试全程指导》(第2版)学习笔记(0)- 启程
- MongoDB3.2---基本操作汇总
- Hibernate再复习(一)
- jqGrid翻页时数据选中丢失问题
- 可折叠手机Galaxy X将问世 三星手机再申请专利