1T数据快速排序!十种经典排序算法总结( 六 )
< min) {min = i;}}//计算桶的数量(可以自定义实现)int bucketNumber = (max - min) / array.length + 1;List
基数排序一般是对所有非负整数进行排序的 , 但是也可以有别的手段来去掉这种限制(比如都加一个固定的数或者都乘一个固定的数 , 排完序后再恢复等等) 。 基数排序和桶排序很像 , 桶排序是按数值的区间进行划分 , 而基数排序是按数的位数进行划分 。 同时这两个排序都是需要依靠其他排序算法来实现的(如果不算递归调用桶排序本身的话) 。 基数排序每一轮的内部排序会使用到计数排序来实现 , 因为每一位上的数字无非就是0-9 , 是一个小范围的数 , 所以使用计数排序很合适 。
基数排序执行示意图:
文章插图
具体的实现代码如下:
public int[] radixSort(int[] array) {if (array == null || array.length < 2) {return array;}//记录待排序数组中的最大值int max = array[0];for (int i : array) {if (i > max) {max = i;}}//获取最大值的位数int maxDigits = 0;while (max != 0) {max /= 10;maxDigits++;}//用来计数排序的临时数组int[] temp = new int[10];//用来存放每轮排序后的结果int[] sortedArray = new int[array.length];for (int d = 1; d <= maxDigits; d++) {//每次循环开始前都要清空temp数组中的值replaceArray(temp, null);//记录每个数出现的次数for (int a : array) {temp[getNumberFromDigit(a, d)]++;}//将temp数组进行转换 , 记录每个数在最后排好序的数组中应该要存放的位置+1(如果有重复的就记录最后一个)for (int j = 1; j < temp.length; j++) {temp[j] += temp[j - 1];}//这里必须是从后往前遍历 , 以此来保证稳定性for (int i = array.length - 1; i >= 0; i--) {int index = getNumberFromDigit(array[i], d);sortedArray[temp[index] - 1] = array[i];temp[index]--;}//一轮计数排序过后 , 将这次排好序的结果赋值给原数组replaceArray(array, sortedArray);}return array;}private final static int[] sizeTable = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};/** * 获取指定位数上的数字是多少 */private int getNumberFromDigit(int number, int digit) {if (digit < 0) {return -1;}return (number / sizeTable[digit - 1]) % 10;}private void replaceArray(int[] originalArray, int[] replaceArray) {if (replaceArray == null) {for (int i = 0; i
推荐阅读
- 西部数据在CES 2021推出多款4TB容量的旗舰级SSD
- WhatsApp收集用户数据新政惹众怒,“删除WhatsApp”在土耳其上热搜
- “千店同开”引质量担忧,小米回应
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 企业|技术快速迭代倒逼知识产权“贴身”服务,上海首家AI商标品牌指导站入驻徐汇西岸
- 黑客窃取250万个人数据 意大利运营商提醒用户尽快更换SIM卡
- 阳狮报告:4成受访者认为自己的数据比免费服务更有价值
- 中消协点名大数据网络杀熟 反对利用消费者个人数据画像
- 学习大数据是否需要学习JavaEE
- 意大利运营商Ho Mobile被曝数据泄露
