面试面试算法十大经典排序算法之基数排序
云少十大经典排序算法之基数排序
master ,这是我的小站,欢迎访问哦~~
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
1. 基数排序 vs 计数排序 vs 桶排序
基数排序有两种方法:
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
- 基数排序:根据键值的每位数字来分配桶;
- 计数排序:每个桶只存储单一键值;
- 桶排序:每个桶存储一定范围的数值;
2. LSD 基数排序动图演示

3. JavaScript 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| var counter = []; function radixSort(arr, maxDigit) { var mod = 10; var dev = 1; for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) { for(var j = 0; j < arr.length; j++) { var bucket = parseInt((arr[j] % mod) / dev); if(counter[bucket]==null) { counter[bucket] = []; } counter[bucket].push(arr[j]); } var pos = 0; for(var j = 0; j < counter.length; j++) { var value = null; if(counter[j]!=null) { while ((value = counter[j].shift()) != null) { arr[pos++] = value; } } } } return arr; }
|
4. Java 代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public int[] radixSort(int[] A, int n) { int length = n; int divisor = 1; int[][] bucket = new int[10][length]; int[] count = new int[10]; int digit; for (int i = 1; i <= 3; i++) { for (int temp: A) { digit = (temp / divisor) % 10; bucket[digit][count[digit]++] = temp; } int k = 0; for (int b = 0; b < 10; b++) { if (count[b] == 0) continue; for (int w = 0; w < count[b]; w++) { A[k++] = bucket[b][w]; } count[b] = 0; } divisor *= 10; } return A; }
|