文章目录

  • 计数排序
    • java代码实现
    • 单元测试
  • 桶排序
    • java代码实现
    • 单元测试

计数排序

java代码实现

package csdn.dreamzuora.sort;import java.util.List;/*** Title: 抽象出排序类* Description:** @version 1.0* @author: weijie* @date: 2020/10/22 17:59*/
public abstract class Sort<E> {public void sort(List<E> array){};public void sort(List<E> array, int left, int right){};}
package csdn.dreamzuora.sort;import java.util.ArrayList;
import java.util.List;/*** Title: 计数排序* Description:* 思想:牺牲空间换取时间 计数排序需要占用大量空间,它仅适用于数据比较集中的情况* @version 1.0* @author: weijie* @date: 2020/10/26 23:30*/
public class CountSort extends Sort<Integer> {@Overridepublic void sort(List<Integer> array) {int size = array.size();Integer max = array.get(0);Integer min = array.get(0);//找出最大值,最小值for (int i = 1; i < size; i++){Integer val = array.get(i);if (max < val){max = val;}if (min > val){min = val;}}//计算空间占用int len = max - min;//数值偏移量int offset = min;//利用最大值和最小值分配空间int [] tempList = new int[len + 1];for (int i = 0; i < size; i++){Integer val = array.get(i) - offset;Integer count = tempList[val];if (count == null){count = 0;}tempList[val] = ++count;}int k = 0;for (int i = 0; i < len; i++){Integer count = tempList[i];if (count != null){while (count != 0){array.set(k++, i + offset);count --;}}}}
}

单元测试

package csdn.dreamzuora.sort;import org.junit.Test;
import org.junit.jupiter.api.Assertions;import java.util.Arrays;
import java.util.List;import static org.junit.Assert.*;/*** Title:* Description:** @version 1.0* @author: weijie* @date: 2020/10/27 12:12*/
public class CountSortTest {@Testpublic void sort() {CountSort countSort = new CountSort();List<Integer> list = Arrays.asList(4, 8, 4, 6, 2, 10);List<Integer> expectList = Arrays.asList(2, 4, 4, 6, 8, 10);countSort.sort(list);Assertions.assertEquals(expectList, list);}
}

桶排序

java代码实现

package csdn.dreamzuora.sort;import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;/*** Title: 桶排序* Description: 注意和计数排序区别* 桶排序可用于最大最小值相差较大的数据情况,比如[9012,19702,39867,68957,83556,102456]。** 思想:把数组 arr 划分为n个大小相同子区间(桶),每个子区间各自排序,最后合并* 计数排序是桶排序的一种特殊情况** @url:https://www.cnblogs.com/qq1452753919/p/10506114.html** @version 1.0* @author: weijie* @date: 2020/10/22 17:52*/
public class BucketSort extends Sort<Integer>{@Overridepublic void sort(List<Integer> array) {if (array == null || array.isEmpty()){return;}int max = array.get(0);int min = array.get(0);int size = array.size();for (int i = 0; i < size; i++){max = Math.max(array.get(i), max);min = Math.min(array.get(i), min);}int offset = max - min;int bucketSize = (max - min) / size + 1;List<LinkedList<Integer>> bucketList = new ArrayList<>(bucketSize);//桶初始化for (int i = 0; i < bucketSize; i++){bucketList.add(new LinkedList<>());}//将每个元素放入桶中for (int i= 0; i < size; i++){int val = array.get(i);// 3 17 20 48    45/5=9+1=10int num = (array.get(i) - min) * (bucketSize - 1) / offset;bucketList.get(num).add(val);}List<Integer> sortList = new ArrayList<>();//对每个桶进行排序for (int i = 0; i < bucketSize; i++){Collections.sort(bucketList.get(i));}//输出全部元素int index = 0;for (LinkedList<Integer> itemList : bucketList){for (Integer val : itemList){sortList.set(index++ , val);}}}
}

单元测试

package csdn.dreamzuora.sort;import org.junit.Test;
import org.junit.jupiter.api.Assertions;import java.util.*;import static org.junit.Assert.*;/*** Title:* Description:** @version 1.0* @author: weijie* @date: 2020/10/27 23:45*/
public class BucketSortTest {BubbleSort bubbleSort = new BubbleSort();@Testpublic void sort() {List<Integer> list = Arrays.asList(4, 8, 4, 6, 2, 10);List<Integer> expectList = Arrays.asList(2, 4, 4, 6, 8, 10);bubbleSort.sort(list);Assertions.assertEquals(expectList, list);}@Testpublic void sort2() {Random random = new Random();List<Integer> actuallyList = Arrays.asList(random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100));List<Integer> expectList = new ArrayList<>(actuallyList);Collections.sort(expectList);bubbleSort.sort(actuallyList);Assertions.assertEquals(expectList, actuallyList);}
}

计数排序和桶排序 java代码实现相关推荐

  1. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  2. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  3. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  4. 十大排序算法详解(二)归并排序、堆排序、计数排序、桶排序、基数排序

    文章目录 一.归并排序 1.1 归并排序基础[必会知识] 1.1.1 递归实现 1.1.2 非递归实现 1.2 归并排序优化 1.2.1 小数组使用插入排序 1.2.2 避免多余比较 1.2.3 节省 ...

  5. 数据结构与算法学习--排序(桶排序,计数排序,基数排序)

    基数排序和计数排序可以参照链接 桶排序: 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递 ...

  6. 八十五、再探希尔排序,桶排序,计数排序和基数排序

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 关于排序,其实还有很多,比如常见的希尔排序,桶排序,计数排序和基数排 ...

  7. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  8. 算法与数据结构07:前缀树,计数排序与桶排序

    算法与数据结构07:前缀树,计数排序与桶排序 前缀树 计数排序 桶排序 前缀树 Trie 1.根据字符串数组中,每个字符串的字符作为路径,组成而成的一个多叉树结构 2.每个节点都有一个paths数组, ...

  9. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

最新文章

  1. 视频会议已成为武汉新趋势,在未来,线上会议有机会成为「主流」会议模式吗?
  2. 发现IE7 Quick Tabs内容同步有bug
  3. c语言设置程序自动执行,c语言如何设置程序进程执行优先权
  4. 教材管理系统紧张开发中
  5. 【AcWing 243. 一个简单的整数问题2】
  6. 吴恩达深度学习5.1练习_Sequence Models_Building a RNN Step by Step
  7. 算法稳定币项目Basis Cash将于2月7日启动V2迁移计划
  8. SAP License:财务帐与后勤不一致情况
  9. kernel headers
  10. python开发直播网站_开发直播网站源码的三种计算机语言
  11. stm32f407 spi3 mosi没有输出_入门篇 | STM32F407寄存器开发点灯
  12. JScript中的条件注释详解(转载自网络)
  13. 华为首款可折叠屏5G手机今日开售;GitHub将开源代码保存在北极;Win10禁用WEP加密|极客头条...
  14. 【时间序列预测】基于matlab麻雀算法优化LSTM时间序列预测【含Matlab源码 JQ001期】
  15. 黑客与电脑白的聊天记录
  16. html flag属性,纯CSS实现文章左上角Flag标签
  17. 骁龙865相当于什么处理器 骁龙865相当于麒麟的多少
  18. mysql语句高逼格_求一些逼格高的语句?
  19. Android手机电池不耐用,手机电池用久了不耐用?教你几招让它“起死回生”!
  20. 如何测试一个一次性水杯

热门文章

  1. android时间最大,Android TimePickerDialog设置最大时间
  2. 虚拟跳线软件干什么用的_视频教程:用 ESI 的虚拟跳线给你的声音添加效果
  3. 西安电子科技大学研究生计算机专业王宇平教授学生就业岗位,西安电子科技大学计算机学院导师信息情况...
  4. r720支持多少频率的内存吗_电脑基础知识:内存条知识大全,看完小学生都了解...
  5. 完全弄懂C++中的构造与析构函数
  6. 计算机终端网络准入控制要求,计算机网络终端准入控制技术资料.pdf
  7. linux telnet.class,Linux telnet简单实用方法
  8. element ui 多个子组件_vue前端UI框架,一点都不圆润,盘它!
  9. 光电转换模块_光模块:PIN光电二极管和APD光电二极管
  10. lrange是取出所有值并移除么_部落冲突:兵营容量提升,移除超级部队、英雄防御状态冷却时间...