基数排序
基数排序是使用空间换时间的经典算法。
- 思路分析:
- 计算数组中的最大位数。
- 比较数组的个位数,并放入对应digit的桶中。
- 依次取出此时桶中的元素放回数组。取出后将桶中清空。
- 在比较数组的十位数,并放入对应digit的桶中。
- 依次取出桶中的元素放回数组…… 重复以上动作,直到比较到最高位为止。
- 思路转化:
- 10个桶可以用二维数组来表示:
bucket[10][a.length]
。a.length
表示待排数组的长度,也就是桶的最大容量。 - 用一维数组
bucketCapacity[digit]
表示第digit个桶内的元素个数。 bucketCapacity[digit]=0
表示当前桶中元素为零,也可表示清空第digit标号的桶内元素。
- 图解算法:
注: 以下代码实现的基数排序不可处理负数
代码实现
import java.util.Arrays;
/**
* @Author 不知名网友鑫
* @Date 2022/3/26
**/
public class RadixSort {
public static void main(String[] args) {
int a[]={53, 3, 542, 748, 14, 214};
RadixSort(a);
System.out.println(Arrays.toString(a));
}
public static void RadixSort(int []a){
//计算数组中的最大位数。
int max=0;
for(int i=0;i<a.length;i++){
if(max<=a[i]){
max=a[i];
}
}
//计算位数的技巧。
int maxLength=(max+"").length();
//利用二维数组定义10个桶,用来存放数据。 每个桶的标号为digit。
int [][] bucket=new int[10][a.length];
int digit=0;
//利用一维数组控制桶内的容量。
//例如:bucketCapacity[0]=1 表示第0个桶内有1个数字。
int [] bucketCapacity=new int[10];
//第一层for循环表示需要放入桶内的次数,也就是按位数计算。
for(int i=0,n=1;i<maxLength;i++,n*=10){
// 1. 第二层for循环表示将待排数组内的数按位数放入桶中。
for(int j=0;j<a.length;j++){
digit=a[j]/n % 10;
//digit:表示放在第几个桶内。 bucketCapacity[digit]:表示放在第digit桶内的第几个位置/第几个数。
bucket[digit][bucketCapacity[digit]]=a[j];
//放在digit桶内的数加1。
bucketCapacity[digit]++;
}
// 2. 第二层for循环表示将桶中元素放入数组。
int index=0;
for(int k=0;k<bucketCapacity.length;k++){
//如果桶内容量不为0。
if(bucketCapacity[k]!=0) {
for (int l = 0; l < bucketCapacity[k]; l++){
//将bucket中的元素1取出到数组。
a[index++] = bucket[k][l];
}
}
//取出后,将对应的桶容量置为0。
bucketCapacity[k] = 0;
}
}
}
}
算法的时间复杂度O(n^2)
当n==8000000
时,算法的运行时间如下:
可见,该算法的运行效率还是很快的。
最后,如有错误,欢迎大佬指正~~
如果觉得写的还不错的话,欢迎点一个⭐收藏⭐再走哦~~~