基数排序

基数排序是一种借助多关键字排序思想对单逻辑关键字进行排序的方法。

所谓的多关键字排序就是有多个优先级不同的关键字。比如说成绩的排序,如果两个人总分相同,则语文高的排在前面,语文成绩也相同则数学高的排在前面。。。如果对数字进行排序,那么个位、十位、百位就是不同优先级的关键字,如果要进行升序排序,那么个位、十位、百位优先级一次增加。
基数排序是通过多次的收分配和收集来实现的,关键字优先级低的先进行分配和收集。
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

实现代码:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 基数排序
* @param {Array<Number>} arry 要排序的数组
*/
function RadixSort(arry) {
if (arry.length == 0) {//判断数组不为空
return [];
}
const maxDigit = getMaxDigit(getMaxValue(arry));//最大数位数
for (let i = 0; i < maxDigit; i++) {
let count = [];
for (let j = 0; j < arry.length; j++) {
const length = `${arry[j]}`.length;//当前数位数
let bucket = 0;
if (length > i) {//当前位数不为空
bucket = parseInt(`${arry[j]}`.substr(length - i - 1, 1));
}
if (!count[bucket]) {
count[bucket] = [];
}
count[bucket].push(arry[j]);//位数数组填充
}
for (let t = 0, pos = 0; t < count.length; t++) {//根据新数组重新排序
let value = null;
if (count[t]) {
while ((value = count[t].shift()) != null) {
arry[pos++] = value;
}
}
}
console.log(arry)
}
return arry;
}
/**
* 获取数组中最大数
* @param arry 排序数组
*/
function getMaxValue(arry) {
let maxValue = arry[0];
for (let i = 1; i < arry.length; i++) {
if (arry[i] > maxValue) {
maxValue = arry[i]
}
}
return maxValue;
}
/**
* 整数位数
* @param value 整数
*/
function getMaxDigit(value) {
return `${value}`.length;
}
RadixSort([72, 6, 57, 88, 60, 42, 11183, 73, 1148, 185])

运行结果:

1
2
3
4
5
[ 60, 72, 42, 11183, 73, 185, 6, 57, 88, 1148 ]//个位排序
[ 6, 42, 1148, 57, 60, 72, 73, 11183, 185, 88 ]//十位排序
[ 6, 42, 57, 60, 72, 73, 88, 1148, 11183, 185 ]//百位排序
[ 6, 42, 57, 60, 72, 73, 88, 185, 1148, 11183 ]//千位排序
[ 6, 42, 57, 60, 72, 73, 88, 185, 1148, 11183 ]//万位排序