基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
1. 基数排序 vs 计数排序 vs 桶排序
基数排序有两种方法:
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
- 基数排序:根据键值的每位数字来分配桶;
- 计数排序:每个桶只存储单一键值;
- 桶排序:每个桶存储一定范围的数值;
public class RadixSort { public static void main(String[] args) { int arr[] = {53, 3, 542, 748, 14, 214}; radixSort(arr); } public static void radixSort(int arr[]) { //1.得到数组中最大数的位数 int max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } //最大数的位数 int maxLength = (max + "").length(); //1.二维数组包含10个一维数组 int bucket[][] = new int[10][arr.length]; //为了记录每个桶中,实际存放了多少了数 定义一个一维数组来记录每个桶的每次放入的数据个数 int bucketCount[] = new int[10]; for (int i = 0, n = 1; i < maxLength; i++, n *= 10) { for (int j = 0; j < arr.length; j++) { int digitEle = arr[j] / n % 10; //放入对应的桶中 bucket[digitEle][bucketCount[digitEle]] = arr[j];//[bucketCount[digitEle]]从0开始 bucketCount[digitEle]++; } //按照这个桶的顺序(一维数组的下标依次取出数据 放入原来数组) int index = 0; for (int k = 0; k < 10; k++) { //如果桶中有数据 //bucketCount :存放的是数据的个数 if (bucketCount[k] != 0) { for (int l = 0; l < bucketCount[k]; l++) { //取出元素放到arr arr[index++] = bucket[k][l]; } } //清空 bucketCount[k] = 0; } System.out.println("第" + (i + 1) + "轮的结果" + Arrays.toString(arr)); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律