基数排序(JS代码)
基数排序的排序思路是这样的:先以个位数的大小来对数据进行排序,接着以十位数的大小来多数进行排序,接着以百位数的大小……
排到最后,就是一组有序的元素了。不过,他在以某位数进行排序的时候,是用“桶”来排序的。
由于某位数(个位/十位….,不是一整个数)的大小范围为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