基数排序:基数排序只是针对于数字,思想就是将我们需要待排列的元素按照指定的进制将每一位排列,时间复杂度为:
P(N+B)
,注:其中
P
为待排列数字的最大位数,
首先我们来看利用LSD(次位优先)进行基数排序
我们首先用图片描述一下这种方式
(图片出自于网易云课堂)
// 获得每位的数字
function RadixLSDSort (arr, digit) {
const radix = 10; // 基数,以10进制来进行排序
var i = 0,
j = 0,
count = Array(radix), // 0~9的桶
end = arr.length,
bucket = Array(end);
// 利用LSD,也就是次位优先
for (var d = 1; d <= digit; d++) {
for (i = 0; i < radix; i++) {
count[i] = 0;
}
// 向各个桶中添加元素,并统计出每个桶中装的个数
for (i = 0; i < end; i++) {
j = getDigit(arr[i], d);
count[j]++;
}
// count的越往后值最大,最大值为arr.length
// count数组的值为,该位数值为该索引的数字总数
for (i = 1; i < radix; i++) {
count[i] = count[i] + count[i - 1];
}
// 按照桶的顺序将导入temp中
for (i = end - 1; i >= 0; i--) {
j = getDigit(arr[i], d);
bucket[count[j] - 1] = arr[i];
count[j]--;
}
// 将已经根据相应位数排好的序列导回arr中
for (i = 0; i < end; i++) {
arr[i] = bucket[i];
}
}
}