// åºæ°æåº module.exports = function RadixSort(nums) { if(nums === null || nums.length <= 1) return; _RadixSort(nums, 0, nums.length -1, maxBits(nums)); } // è·åæå¤§å¼ç使° function maxBits(nums) { var max = nums[0]; for(var i = 1; i < nums.length; i++) { max = Math.max(max, nums[i]); } var res = 0; while(max !== 0) { res++; max = parseInt(max/10); } return res; } function _RadixSort(nums, begin, end, digit) { const radix = 10; var i = 0; var j = 0; var count = new Array(radix); var bucket = new Array(end-begin+1); for(var d = 1; d <= digit; d++) { // å°countæ°ç»æ¯ä¸ªå ç´ ç½®0 for (i = 0; i < radix; i++) { count[i] = 0; } // 循ç¯è®°å½æ¯ä¸ªä½ä¸æ°åç个æ°ã for(i = begin; i <= end; i++) { j = getDigit(nums[i], d); count[j]++; } // è¡¥å 使°ï¼ç¨äºå颿¡¶æ°ç»æ¾å°å¯¹åºçä½ç½® for(i = 1; i < radix; i++) { // æè®¡æ°çæ°ç»æ¹ä¸ºè®°å½é¡ºåºçæ°ç»ã // å¦åå æ°ç»ï¼ 28ï¼ 1ï¼ 42 // 忥countæ°ç»ï¼ 0 1 1 0 0 0 0 0 1 0 // ä¿®æ¹countå: 0 1 2 2 2 2 2 2 3 3 // ç¨äºä¸é¢bucketæ¾å°å¯¹åºç´¢å¼ count[i] = count[i] + count[i - 1]; } // æç §count顺åºç»bucketèµå¼ for(i = end; i >= begin; i--) { j = getDigit(nums[i], d); bucket[count[j] - 1] = nums[i]; count[j]--; } // æbucketæ°ç»çå¼èµå¼ç»æ°ç» for(i = begin, j = 0; i <= end; i++, j++) { nums[i] = bucket[j]; } } } // è·åd * 10ä½ä¸çæ° function getDigit(x, d) { return parseInt(((x / parseInt(Math.pow(10, d - 1))) % 10)); }