基数排序的排序思路是这样的:先以个位数的大小来对数据进行排序,接着以十位数的大小来多数进行排序,接着以百位数的大小……
排到最后,就是一组有序的元素了。不过,他在以某位数进行排序的时候,是用“桶”来排序的。
由于某位数(个位/十位….,不是一整个数)的大小范围为0-9,所以我们需要10个桶,然后把具有相同数值的数放进同一个桶里,之后再把桶里的数按照0号桶到9号桶的顺序取出来,这样一趟下来,按照某位数的排序就完成了
具体步骤:
- 取得数组中的最大数,并取得位数;
- this为原始数组,从最低位开始取每个位组成radix数组;
- 对radix进行计数排序(利用计数排序适用于小范围数的特点);
Array.prototype.radioSort = function() {
let len = this.length
if (len < 2) {
return
}
let counter = []
let mod = 10
let dev = 1
// 找出最大位数
let maxNum
for (let i = 0; i < len-1; i++) {
if (this[i] > this[i+1]) {
maxNum = this[i]
} else {
maxNum = this[i+1]
}
}
let maxDigit = 0
while (maxNum != 0) {
maxNum = parseInt(maxNum/10)
maxDigit++;
}
for (let i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
for(let j = 0; j < this.length; j++) {
let bucket = parseInt((this[j] % mod) / dev)
if(counter[bucket]==null) {
counter[bucket] = []
}
counter[bucket].push(this[j])
}
let pos = 0
for(let j = 0; j < counter.length; j++) {
let value = null
if(counter[j]!=null) {
while ((value = counter[j].shift()) != null) {
this[pos++] = value
}
}
}
}
}
let arr = [2,9,5,7,1,1,6,3,3,4]
arr.radioSort()
console.log("排序后:", arr.toString())
// 1,1,2,3,3,4,5,6,7,9