//基数排序
public class RadixSort {
public void radixSort(int[] data, int left, int right) {
if (left < 0 || right > data.length - 1 || left >= right) {
return;
}
int maxDigit = getMaxDigit(data);
int mod = 10;
int dev = 1;
for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
// 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
// 列初始化为0,是为了节省空间,要插入数据时,再扩容。
int[][] counter = new int[20][0];
for (int j = left; j <= right; j++) {
// data[j]%mod:1234 % 100 = 34; 34 / 10 = 3
// (因为是整型数),这样就得到十位上的数了,
// +10是因为前面扩充了,[10-19]才对应正数。
int bucket = ((data[j] % mod) / dev) + 10;
counter[bucket] = arrayAppend(counter[bucket], data[j]);
}
// 把篮子里的数据拿出来放入数组内
int index = left;
for (int[] bucket : counter) {
for (int value : bucket) {
// index++是先运行完data[index],再将index++;
// ++index是先将index加了,再运行data[index],此时相当于data[index+1];
data[index++] = value;
}
}
}
}
// 获取最高位数,就是绝对值最大值有多少位。
private int getMaxDigit(int[] data) {
int maxAbsValue = getAbsMaxValue(data);
return getNumLength(maxAbsValue);
}
// 获取绝对值最大值,循环一遍找出来
private int getAbsMaxValue(int[] data) {
int maxAbsValue = data[0];
for (int value : data) {
if (Math.abs(maxAbsValue) < Math.abs(value)) {
maxAbsValue = value;
}
}
return maxAbsValue;
}
// 获取数字的位数
private int getNumLength(int value) {
if (value == 0) {
return 1;
}
int length = 0;
// 利用整形数会舍掉小数的机制
for (int i = value; i != 0; i /= 10) {
length++;
}
return length;
}
// 给数组扩容
private int[] arrayAppend(int[] data, int value) {
data = Arrays.copyOf(data, data.length + 1);
data[data.length - 1] = value;
return data;
}
}
八大排序算法——基数排序(八)
最新推荐文章于 2024-09-21 21:47:15 发布