(十二)Java算法:桶排序(详细图解)
创始人
2024-02-28 20:32:51
0

目录

    • 一、前言
      • 1.1、概念
      • 1.2、算法步骤
    • 二、maven依赖
    • 三、流程解析
      • 3.1、桶编号计算
      • 3.2、桶元素排序
    • 四、编码实现

一、前言

1.1、概念

   计数排序:的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数

1.2、算法步骤

  • 找出待排序的数组中的最大元素max和最小元素min
  • 根据指定的桶数创建桶,本文使用的桶是List结构,桶里面的数据也采用List结构存储
  • 根据公式遍历数组元素:桶编号 = (数组元素 - 最小值) * (桶个数 - 1) / (最大值 - 最小值),把数据放到相应的桶中
  • 从小到大遍历每一个桶,同时对桶里的元素进行排序
  • 把排好序的元素从索引为0开始放入(因为前一个桶的数据一定小于后一个桶的数据,然后每个桶里的数据又是有序的),完成排序

二、maven依赖

pom.xml

org.springframework.bootspring-boot-starter2.6.0org.projectlomboklombok1.16.14

三、流程解析

  假设我们要排序的数据是:15, 8, 23, 38, 28, 19, 32, 21, 9

3.1、桶编号计算

  通过我们的整体流程图,来看看数据是怎么分,又是怎么合成的。

  桶编号 = (数组元素 - 最小值) * (桶个数 - 1) / (最大值 - 最小值)

数组索引数组数据计算桶编号
015(15−8)∗(4−1)(38−8)=0\frac{(15 - 8) * (4 - 1)}{(38 - 8)}=0(38−8)(15−8)∗(4−1)​=0
18(8−8)∗(4−1)(38−8)=0\frac{(8 - 8) * (4 - 1)}{(38 - 8)}=0(38−8)(8−8)∗(4−1)​=0
223(23−8)∗(4−1)(38−8)=1\frac{(23 - 8) * (4 - 1)}{(38 - 8)}=1(38−8)(23−8)∗(4−1)​=1
338(38−8)∗(4−1)(38−8)=3\frac{(38 - 8) * (4 - 1)}{(38 - 8)}=3(38−8)(38−8)∗(4−1)​=3
428(28−8)∗(4−1)(38−8)=2\frac{(28 - 8) * (4 - 1)}{(38 - 8)}=2(38−8)(28−8)∗(4−1)​=2
519(19−8)∗(4−1)(38−8)=1\frac{(19 - 8) * (4 - 1)}{(38 - 8)}=1(38−8)(19−8)∗(4−1)​=1
632(32−8)∗(4−1)(38−8)=2\frac{(32 - 8) * (4 - 1)}{(38 - 8)}=2(38−8)(32−8)∗(4−1)​=2
721(21−8)∗(4−1)(38−8)=1\frac{(21 - 8) * (4 - 1)}{(38 - 8)}=1(38−8)(21−8)∗(4−1)​=1
89(9−8)∗(4−1)(38−8)=0\frac{(9 - 8) * (4 - 1)}{(38 - 8)}=0(38−8)(9−8)∗(4−1)​=0

  根据计算把数据放到相应的桶中,如下图所示:

在这里插入图片描述

3.2、桶元素排序

  接下里我们对桶里的元素进行排序,我这里为了省事就采用自带的排序了,排序结果如下:

在这里插入图片描述
  你可以使用其他任意排序算法进行(比如快速排序,插入排序等等),当然这里递归使用桶排序也是可以的。

四、编码实现

/*** 桶排序** @param arr* @param bucketSize*/
public static void bucketsort(int[] arr, int bucketSize) {// 初始化最大最小值int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;// 找出最小值和最大值for (int num : arr) {max = Math.max(max, num);min = Math.min(min, num);}// 创建bucketSize个桶List> bucketList = new ArrayList<>();// 声明五个桶for (int i = 0; i < bucketSize; i++) {bucketList.add(new ArrayList<>());// 确定桶的格式为ArrayList}// 将数据放入桶中for (int num : arr) {// 确定元素存放的桶号int bucketIndex = (num - min) * (bucketSize - 1) / (max - min);//重点log.info("({} - {}) * ({} - 1) / ({} - {})={}", num, min, bucketSize, max, min, bucketIndex);log.info("【{}】放入到第【】号桶中:{}", num, bucketIndex + 1);List list = bucketList.get(bucketIndex);list.add(num);// 将元素存入对应的桶中}// 遍历每一个桶for (int i = 0, arrIndex = 0; i < bucketList.size(); i++) {List list = bucketList.get(i);log.info("第【{}】桶的数据为:{}", i + 1, list);list.sort(null);// 对每一个桶排序for (int value : list) {arr[arrIndex++] = value;}}
}public static void main(String[] args) {int[] arr = {15, 8, 23, 38, 28, 19, 32, 21, 9};log.info("要排序的初始化数据:{}", arr);//从小到大排序bucketsort(arr, 4);log.info("结果为:{}", arr);
}

运行结果:

要排序的初始化数据:[15, 8, 23, 38, 28, 19, 32, 21, 9]
(15 - 8) * (4 - 1) / (38 - 8)=0
【15】放入到第【】号桶中:1
(8 - 8) * (4 - 1) / (38 - 8)=0
【8】放入到第【】号桶中:1
(23 - 8) * (4 - 1) / (38 - 8)=1
【23】放入到第【】号桶中:2
(38 - 8) * (4 - 1) / (38 - 8)=3
【38】放入到第【】号桶中:4
(28 - 8) * (4 - 1) / (38 - 8)=2
【28】放入到第【】号桶中:3
(19 - 8) * (4 - 1) / (38 - 8)=1
【19】放入到第【】号桶中:2
(32 - 8) * (4 - 1) / (38 - 8)=2
【32】放入到第【】号桶中:3
(21 - 8) * (4 - 1) / (38 - 8)=1
【21】放入到第【】号桶中:2
(9 - 8) * (4 - 1) / (38 - 8)=0
【9】放入到第【】号桶中:1
第【1】桶的数据为:[15, 8, 9]
第【2】桶的数据为:[23, 19, 21]
第【3】桶的数据为:[28, 32]
第【4】桶的数据为:[38]
结果为:[8, 9, 15, 19, 21, 23, 28, 32, 38]

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...