排序算法之基数排序

简介:

基数排序属于“分配式排序”,又称“桶子法”,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。

思路:

如果数组中有负数,那么让所有的数加上最小数的绝对值,将所有的数"提升"为正数再进行排序。准备十个桶分别为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     }
复制代码

 

posted @   Java厨师长  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示