基数排序(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

  

posted @ 2020-03-16 16:39  七度丢失的梦  阅读(511)  评论(0编辑  收藏  举报