基数排序
介绍
1.属于“分配式排序”,是桶排序的拓展
2.以空间换时间,效率高的稳定性排序法
基本思想(从小到大)
1.所有待比较数组统一为同样位数长度,位数较短的数前面补0
2.桶是二维数组,总共10桶,0至9号桶,号数表示位数上的值;从最低位(个位)开始,位数为几,就放入几号桶
3.按二维数组下标0至9顺序,从一维数组下标顺序取出元素,放回元素组
4.重复步骤2,步骤3,直到最高位,得到有序数组
代码实现(不支持小数)
public class RadixSort {//从小到大排序
public static void radixSort(int[] array) {
if (array == null || array.length <= 1) {
return;
}
int min = array[0];
int max = array[0];
for (int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];//获取array中最大数
}
if (array[i] < min) {
min = array[i];//获取array中最小数
}
}
if (min < 0) {//若min为负数,所有元素减去min,使所有元素大于等于0
for (int i = 0; i < array.length; i++) {
array[i] = array[i] - min;
max -= min;//获取的max也要改变
}
}
int maxLength = (max + "").length();//获取最大数的位数
int[][] bucket = new int[10][array.length];//创建0-9号桶,每个桶大小为array.length
int[] elementCounts = new int[10];//记录每个桶元素个数,如,elementCounts[0]记录0号桶元素个数
for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
for (int j = 0; j < array.length; j++) {//遍历array
int digit = array[j] / n % 10;//第一轮循环获取个位数,以此类推
bucket[digit][elementCounts[digit]] = array[j];//根据digit,顺序进入相应号数的桶
elementCounts[digit]++;//桶的元素个数+1
}
int index = 0;
for (int k = 0; k < elementCounts.length; k++) {//k表示几号桶,从0号桶,遍历到9号桶
if (elementCounts[k] != 0) {//该桶元素个数不为0才遍历取出
for (int l = 0; l < elementCounts[k]; l++) {//从下标0开始取出该桶所有元素
array[index++] = bucket[k][l];
}
}
elementCounts[k] = 0;//每取完一个桶的元素,把该桶元素个数记录置为0
}
}
if (min < 0) {//排序完成后,若min为负数,所有元素加上max,使所有元素恢复
for (int i = 0; i < array.length; i++) {
array[i] = array[i] + min;
}
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战