基数排序(桶排序)
基数排序的步骤如下:
- 从最低位开始,按照每一位的数字将整数分配到对应的桶中。
- 将所有整数按照当前位的顺序重新排列。
- 重复以上步骤,直到所有位数都被考虑过。
基数排序代码实现
基数排序会耗费额外的空间,用空间换取时间,数据量过于大可能会引起内存不足
public class RadixSort {
public static void main(String[] args) {
int[] arr = {53,3,542,748,14,214};
radix(arr);
}
//基数排序方法
public static void radix(int[] arr){
//得到数组中最大数字的位数,就进行几轮排序
int max = arr[0];//假设第一位就是最大值,之后再进行更迭
for (int i = 1;i < arr.length;i++){
if (arr[i] > max){
max = arr[i];
}
}
//得到最大的数字是几位数
int maxLength = (max + "").length();//运用字符串得出长度
//定义一个二维数组,表示十个桶,每个桶就是一个一维数组
int[][] bucket = new int[10][arr.length];//防止数据溢出,定为arr.length,用空间去换时间
//用一个一位数组来记录每个桶中放入了多少个数据
int[] bucketElements = new int[10];
//使用循环,将代码进行处理
for (int i =0,n = 1;i < maxLength;i++,n *= 10){
//第i+1轮,对每个元素的位置进行排序
for (int j = 0;j < arr.length;j++){
//依次取出每个元素的个位,十位,百位的值
int digit = arr[j] / n % 10;
//放入到相应的桶中
bucket[digit][bucketElements[digit]] = arr[j];
bucketElements[digit]++;//将值放入桶中的同时,也将用来记录的数组加一
}
//然后按照桶的顺序,再依次取出,放入数组中
int index = 0;
//遍历 每一个桶,并判断桶中是否有数据,然后放入原数组
for (int k = 0;k < bucket.length;k++){
//判断桶中是否有数据
if (bucketElements[k] != 0){
//循环,因为是二维数组,取出数据要双层for循环
for (int l = 0;l < bucketElements[k];l++){
//取出元素放到arr
arr[index++] = bucket[k][l];
}
}
//处理后,要将存放有几个数据的数组清零
bucketElements[k] = 0;
}
System.out.println("第"+(i + 1)+"轮排序处理的结果是"+ Arrays.toString(arr));
}
}
}
常用排序算法对比
练练排序算法的题,今日到此为止