基数排序
排序思想
基数排序是桶排序的一种实现方式,多关键字排序。
对于一组数据,从低位到高位依次排序。
负数解决思想: 将负数转换成0或正数,对所有数据同时加上最小值的绝对值。
核心代码
private static void radixSort(int[] arr, int len) {
//获取最大、最小值
int max = arr[0];
int min = arr[0];
for (int i = 1; i < len; i++) {
if (max < arr[i]) {
max = arr[i];
}
if (min > arr[i]) {
min = arr[i];
}
}
//若存在负数 将所有所有值转换为>=0的数
if (min < 0) {
//所有值都加上最小值的绝对值
for (int i = 0; i < len; i++) {
arr[i] -= min;
}
max -= min;
}
//获取最大值位数
int n = (max + "").length();
//桶数组
int[] count = new int[10];
//临时数组
int[] temp = new int[len];
//依次对数据的个、十、百...位进行排序
for (int i = 0; i < n; i++) {
int m = (int) Math.pow(10, i);
for (int j = 0; j < len; j++) {
//获取数据的每一位
int div = arr[j] / m % 10;
//数据入桶
++count[div];
}
//保证数组有序
for (int j = 1; j < count.length; j++) {
count[j] += count[j - 1];
}
//将数据存入临时数组
for (int k = len - 1; k >= 0; k--) {
//获取数据的每一位
int div = arr[k] / m % 10;
temp[--count[div]] = arr[k];
}
System.arraycopy(temp, 0, arr, 0, len);
//将桶中数据个数置零
Arrays.fill(count,0);
}
//将数据还原
if (min < 0) {
for (int i = 0; i < len; i++) {
arr[i] += min;
}
}
}
特点
平均时间复杂度O(nk),最好时间复杂度O(nk),最坏时间复杂度O(n*k)。空间复杂度O(n+k),稳定。