🎡基数排序
- 🎊1、基本思想
- 🎊2、基本步骤
- 🎊3、代码示例
- 🎊4、特性总结
🎊1、基本思想
基数排序(Radix Sort)是一种非比较排序算法,它根据数字的每一位来对元素进行排序。它适用于排序整数或固定长度的字符串。基数排序的主要思想是从最低位(个位)开始,依次对所有元素进行排序,然后再从次低位(十位)开始,以此类推,直到最高位(或最长的字符串长度)排序完成。
🎊2、基本步骤
1、获取待排序的整数列表。
2、初始化一个临时数组,用于存储每个位数的数字出现的次数。
3、从最低位开始,依次遍历待排序的整数列表中的每个数字,统计每个位数的数字出现的次数。
4、将统计结果存储到临时数组中。
5、根据临时数组中的统计结果,依次将待排序的整数列表中的数字移动到正确的位置。
6、重复步骤3-5,直到最高位遍历完毕。
如图:
🎊3、代码示例
public class RadixSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
// 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
int maxDigit = getMaxDigit(arr);
return radixSort(arr, maxDigit);
}
/**
* 获取最高位数
*/
private int getMaxDigit(int[] arr) {
int maxValue = getMaxValue(arr);
return getNumLenght(maxValue);
}
private int getMaxValue(int[] arr) {
int maxValue = arr[0];
for (int value : arr) {
if (maxValue < value) {
maxValue = value;
}
}
return maxValue;
}
protected int getNumLenght(long num) {
if (num == 0) {
return 1;
}
int lenght = 0;
for (long temp = num; temp != 0; temp /= 10) {
lenght++;
}
return lenght;
}
private int[] radixSort(int[] arr, int maxDigit) {
int mod = 10;
int dev = 1;
for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
// 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
int[][] counter = new int[mod * 2][0];
for (int j = 0; j < arr.length; j++) {
int bucket = ((arr[j] % mod) / dev) + mod;
counter[bucket] = arrayAppend(counter[bucket], arr[j]);
}
int pos = 0;
for (int[] bucket : counter) {
for (int value : bucket) {
arr[pos++] = value;
}
}
}
return arr;
}
ate int[] arrayAppend(int[] arr, int value) {
arr = Arrays.copyOf(arr, arr.length + 1);
arr[arr.length - 1] = value;
return arr;
}
}
🎊4、特性总结
空间效率:O(r)
时间效率:O(d(n+r)),它与序列的初始状态无关。
稳定性:稳定。
🎉OK!今天的分享就到这里了,后面还会分享更多算法,敬请关注喔!!!✌️