基数排序就是先对最后一位进行分类排序,然后再对倒数第二位进行排序,然后倒数第三位,直到最后一位,每次对每一位进行排序时,都会不断变得有序
由于每位数大小位0-9,所以我们需要10个桶来排序
如何求个/十/百位上得数是多少呢?int radix = (int) (a[j] / Math.pow(10, i)) % 10;
:因为要求个位就是对整个数取余数10,如果是十位的话先将整个数除以10再取余,如果百位的话就除以100,因此我们可以利用Math的pow函数,来决定每次到底是除以多少
时间复杂度位O(kn)、空间复杂度为O(n + k),是稳定排序,且非原地排序
代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
/**
* @Description: 基数排序
* @Author: LinZeLiang
* @Date: 2020-10-11
*/
public class RadixSort {
public static void main(String[] args) {
int[] a = {9, 54, 3, 6, 43, 11, 27, 98, 43, 5, 2, 89, 1, 4, 8, 16, 20};
radixSort(a);
System.out.println(Arrays.toString(a));
}
private static void radixSort(int[] a) {
//获取最大值
int max =a[0];
for (int i = 1; i < a.length; i++) {
if (max < a[i]) {
max = a[i];
}
}
//获取最大的数的位数
int num = 0;
while (max != 0) {
max /= 10;
num++;
}
//创建10个桶
int bucketNum = 10;
ArrayList<LinkedList<Integer>> bucketList = new ArrayList<>(bucketNum);
//初始化桶
for (int i = 0; i < bucketNum; i++) {
bucketList.add(new LinkedList<Integer>());
}
//进行桶的每一趟排序
for (int i = 0; i < num; i++) {
for (int j = 0; j < a.length; j++) {
//获取最后一位数
//如果是第二趟循环,就除以10然后再取余,这样子就可以实时获取固定位的数,而不改变原数组
int radix = (int) (a[j] / Math.pow(10, i)) % 10;
//放进对应的桶里
bucketList.get(radix).add(a[j]);
}
//合并原数组
int k = 0;
for (LinkedList<Integer> integers : bucketList) {
for (Integer integer : integers) {
a[k++] = integer;
}
//取出来之后将这个桶清空,供下一次循环使用
integers.clear();
}
}
}
}
我们来看看十大排序他们的算法性质:
原文:https://www.cnblogs.com/linzedian/p/13796710.html