基数排序

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

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));
}
}
}
posted @   被动  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示