zoukankan      html  css  js  c++  java
  • 基数排序(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
    

      

  • 相关阅读:
    c#随便写写 数据层和表现层,队列执行
    unity代码设置鼠标样式
    Unity c#反射查找类中符合条件的方法并执行
    封装你的协程Unity TaskManager
    基于steamworks获取steam用户头像
    开启Unity项目中VS工程的属性面板
    移动端的动态阴影
    c#静态扩展方法,字典的克隆扩展方法
    Unity热更方案汇总
    lua输入函数名字符串执行函数
  • 原文地址:https://www.cnblogs.com/bobo1/p/12504806.html
Copyright © 2011-2022 走看看