基数排序(java)
Posted 宁果果卡卡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基数排序(java)相关的知识,希望对你有一定的参考价值。
hello 小伙伴们好久不见!今天卡卡给大家介绍一种非常有趣的排序算法——基数排序。
基数排序是如何进行排序的呢?
在进行基数排序之前我们先准备十个容器分别对应0~9,用来存放数据。然后把所有待比较的数统一为同样数位长度,例5,25,105统一数位为005,025,105。然后从每个数从最低位开始,把待排序的数放入到低位数字对应的容器中,再从每个容器中按加入顺序取出,形成一次排序。这样从最低位排序一直到最高位排序完成后,数列变为有序数列。
下面我们通过图帮助小伙伴们更好的理解!
第一轮排序是按每个数的个位数字进行放入
第二轮排序是在第一轮的基础上按每个数的十位数字进行放入
第三轮排序是在第二轮的基础上按每个数的百位数字进行放入
此时我们的数列已为有序数列,也就是说我们数列中最大位数的数字有多少位就进行多少次循环排序。
下面我们用代码进行实现:
import java.util.Arrays;
//定义十个桶每个桶用来存放数组中数,
//每个桶存放数的个数不确定但总数不会超过arr.lengh
//观察每个数的个位数字找对应的桶,把整个数放入该桶
//然后按顺序取出桶内的数放回原数组
//然后再依次取十位,百位………同上(位数不足补0,即放在为0的桶内)
//(此代码未进行考虑负数和浮点数,若考虑另行参考)
public class Jishupaixun {
public static void main(String[] args) {
int[] arr = { 53, 3, 542, 748, 14, 214 };
array(arr);
//System.out.println(Arrays.toString(arr));
}
private static void array(int[] arr) {
// 定义的十个桶
int[][] a = new int[10][arr.length];
// 表示每个桶的元素个数
int[] bucket = new int[10];
// 假设第一个数为最大的数
int max = arr[0];
// 找出最大的数
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
// 算出最大数的位数
int maxlength = (max + "").length();
// 有多少位就循环多少次
for (int m = 0, n = 1; m < maxlength; m++, n *= 10) {
for (int i = 0; i < arr.length; i++) {
// 取每个元素的个位,十位,百位………
int num = arr[i] / n % 10;
// 把元素放入桶内
a[num][bucket[num]] = arr[i];
// 有重复则+1;
bucket[num]++;
}
// 定义索引记录原数组的下标
int index = 0;
// 遍历每个桶
for (int j = 0; j < bucket.length; j++) {
if (bucket[j] != 0) {
// 如果桶里有数据,循环取出该桶里的数据
for (int l = 0; l < bucket[j]; l++) {
// 取出桶里的数据放入原数组中
arr[index] = a[j][l];
index++;
}
}
// 每排序一次清空桶内的数据
bucket[j] = 0;
}
System.out.println(Arrays.toString(arr));
}
}
}
我们再来看一下运行结果:
结果跟我们的分析过程完全一样!
好了,关于基数排序卡卡今天就介绍到这里了,感谢你的阅读!
以上是关于基数排序(java)的主要内容,如果未能解决你的问题,请参考以下文章