1. 基数排序:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。
2. 基数排序的时间,空间复杂度及稳定性:
1>. 时间复杂度:O(n+m)。
2>. 空间复杂度:S(n+m)。
3>. 稳定性:稳定。
3. 基数排序的实现:
//基数排序
/*
* 基数排序就是对数据的每一位的数字进行操作
* 出桶的顺序类似于队列的出队 先进先出 后进后出
* 1.先寻出数组中的最大值 并获取最大值的位数(即要入桶和出桶的次数)
* 2.先将每个数据放入其个位的数对应的桶的编号中
* 3.再将桶中的数据按照桶编号依次将桶中的数据出桶(先进桶的数据先出桶)
* 1.再将每个数据放入其十位的数对应的桶的编号中
* 2.再将桶中的数据按照桶编号依次将桶中的数据出桶(先进桶的数据先出桶)
* 1.再将每个数据放入其百位的数对应的桶的编号中
* 2.再将桶中的数据按照桶编号依次将桶中的数据出桶(先进桶的数据先出桶)
* ......
* ......
* ......
* 按照这样循环直至数组中的最大值的最高位操作结束后将其出桶 添加到原数组中 就是有序数组
*/
public class RadixSort {
public static void main(String[] args) {
int[] arr = {233, 53, 10, 7, 4, 69, 433, 53, 18, 100};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
//对数组进行基数排序
private static void radixSort(int[] arr) {
//1.先获取分类-收集的轮数
int radix = getRadix(arr);
//2.创建存放桶的集合 集合中包含十个桶 每一个桶LinkedList按照队列的进出元素规则来操作
LinkedList<Integer>[] list = new LinkedList[10];
for(int i = 0; i < list.length; i++) {
list[i] = new LinkedList<Integer>();
}
//3.循环分类-收集的轮数 对数组中的数据进行分类-收集
for(int r = 1; r <= radix; r++) {
//1>.分类的过程 即为 将数组中的数据依次分入规定的桶中
for(int i = 0; i < arr.length; i++) {
//获取数组要分入的桶的编号 并将数字分入对应的桶中
list[getIndex(arr[i], r)].offer(arr[i]);
}
//2>.收集的过程 即为 将所有桶中的数据按照顺序 依次放回到原数组中
int index = 0; //表示原数组中的索引
//将每个桶中的数据依次出队 重新放入原数组arr中 直到每个桶为空
for(int i = 0; i < list.length; i++) {
while(!list[i].isEmpty()) {
arr[index++] = list[i].poll();
}
}
}
}
//获取数组要分入的桶的编号 r=1表示个位 r=2表示十位 r=3表示百位 依次类推
//编号即为数组中元素指定位上的数字
private static int getIndex(int num, int r) {
int index = 0;
for(int i = 1; i <= r; i++) {
index = num % 10;
num /= 10;
}
return index;
}
//获取分类-收集的轮数 即数组中最大数的位数
private static int getRadix(int[] arr) {
int max = arr[0];
for(int i = 1; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}
}
return (max + "").length();
}
}
4. 运行结果: