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
    

      

  • 相关阅读:
    MPLab X 配置字的设置
    System.Windows.Forms.Timer定时器的“自毁”
    单片机部分缩写对照
    我的艰辛之路——2012年个人总结之三
    浏览器IE6不支持的CSS样式的选择符[转]
    SVN 用户权限管理[转]
    VC++ 随机数生成方案选择[转]
    GB/T 77142005参考文献规范[转]
    正则表达式备忘[转]
    文档、视图、框架窗口、文档模板之间的相互关系【转】
  • 原文地址:https://www.cnblogs.com/bobo1/p/12504806.html
Copyright © 2011-2022 走看看