排序算法之基数排序
简介:
基数排序属于“分配式排序”,又称“桶子法”,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。
思路:
如果数组中有负数,那么让所有的数加上最小数的绝对值,将所有的数"提升"为正数再进行排序。准备十个桶分别为0-9,用数的某个位上的值去匹配,然后将数放进对应的桶里。比如个位:
具体要匹配几轮,取决于最大数的最高位,比如现在最大数是562,那么就要匹配个位、十位、百位三轮。
代码:
1 /** 2 * 基数排序 3 * @param arr 可以有负数 4 */ 5 public static void radixSort(int[] arr) { 6 if (arr == null || arr.length == 0) { 7 return; 8 } 9 //十个桶,分别装某位数字是0-9的数 10 int[][] buckets = new int[10][arr.length]; 11 //记录十个桶第一个空值的下标 12 int[] bucketCount = new int[10]; 13 //arr中最大的数,假定arr[0]就是最大的 14 int max = arr[0]; 15 //arr中最小的数,假定arr[0]就是最小的 16 int min = arr[0]; 17 18 for (int i = 0; i < arr.length; i++) { 19 if (min > arr[i]) { 20 min = arr[i]; 21 } 22 if (max < arr[i]) { 23 max = arr[i]; 24 } 25 } 26 //如果min < 0,那么数组中包含负数 27 if (min < 0) { 28 for (int i = 0; i < arr.length; i++) { 29 //让所有的数加上min的绝对值,使所有的数最小的是0 30 arr[i] -= min; 31 } 32 } 33 34 //最大数的位数 35 int maxLength = String.valueOf(max).length(); 36 //数各个位上的值 37 int placeValue; 38 //对每个数的各个位(个位、十位、百位...)进行排序 39 for (int i = 0, k = 1; i < maxLength; i++, k *= 10) { 40 for (int j = 0; j < arr.length; j++) { 41 //取数各个位上的值 42 placeValue = arr[j] / k % 10; 43 //根据placeValue将数放进对应的桶 44 buckets[placeValue][bucketCount[placeValue]] = arr[j]; 45 bucketCount[placeValue]++; 46 } 47 //arr第一个空值的下标 48 int index = 0; 49 //按照顺序将桶里的值取出来给arr 50 for (int j = 0; j < buckets.length; j++) { 51 for (int m = 0; m < bucketCount[j]; m++) { 52 arr[index] = buckets[j][m]; 53 index++; 54 } 55 } 56 //清空桶 57 for (int j = 0; j < bucketCount.length; j++) { 58 bucketCount[j] = 0; 59 } 60 } 61 62 //如果数组中包含负数,那么所有的数减去min的绝对值,将数组恢复原样 63 if (min < 0) { 64 for (int i = 0; i < arr.length; i++) { 65 arr[i] += min; 66 } 67 } 68 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!