這裏是傳送門⇒總結:關於排序算法html
平均時間複雜度 | 最優時間複雜度 | 最差時間複雜度 | 空間複雜度 | 穩定性 | |
---|---|---|---|---|---|
基數排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(n+r) | 穩定 |
// 使用公用函數GetHighDigitTemp // 返回數組元素中的最高位數 function GetHighDigitTemp(array, radix) { var len = array.length; var max = array[0]; for (var i = 1; i < len; i++) { if (array[i] > max) { max = array[i]; } } var digit = 1; for (; max >= radix; digit++) { max /= radix; } return digit; } // 這裏是採用LSD的基數排序 // 此處傳入的array會被直接改變 function RadixSort_LSD(array, radix) { var len = array.length; if (len <= 1) { return; } var digit = GetHighDigitTemp(array, radix); var count = new Array(radix), bucket = new Array(len); for (var i = 0, digitTemp = 1; i < digit; i++, digitTemp *= radix) { for (var j = 0; j < radix; j++) { count[j] = 0; } for (var j = 0; j < len; j++) { var temp = Math.floor(array[j] / digitTemp) % radix; count[temp]++; } for (var j = 1; j < radix; j++) { count[j] += count[j - 1]; } for (var j = len - 1; j >= 0; j--) { var temp = Math.floor(array[j] / digitTemp) % radix; bucket[count[temp] - 1] = array[j]; count[temp]--; } for (var j = 0; j < len; j++) { array[j] = bucket[j]; } } } // 這裏是採用MSD的基數排序 // 此處傳入的array會被直接改變 function RadixSort_MSD(array, radix, digit) { var len = array.length; if (len <= 1 || digit <= 0) { return; } var digitTemp = 1; var bucket = new Array(radix); for (var i = 0; i < radix; i++) { bucket[i] = []; } for (var i = 1; i < digit; i++) { digitTemp *= radix; } for (var i = 0; i < len; i++) { var temp = Math.floor(array[i] / digitTemp) % radix; bucket[temp].push(array[i]); } array.length = 0; for (var i = 0; i < radix; i++) { var sBucketILen = bucket[i].length; if (sBucketILen > 1) { RadixSort_MSD(bucket[i], radix, digit - 1); } for (var j = 0; j < sBucketILen; j++) { array.push(bucket[i][j]); } } } // 執行RadixSort_MSD必須先算出digit,digit爲數組元素中的最高位數 var digit = GetHighDigitTemp(array,radix);
GetHighDigitTemp
的時間複雜度爲O(n)RadixSort_LSD
,其時間複雜度T(n) = O(n + d * (2r + 3n)) = O(d(n + r)),其空間複雜度爲count數組和bucket數組所佔用的內存,S(n) = O(n + r)RadixSort_MSD
,其時間複雜度T(n) = O(d * (br + 2n)) = O(d(r + n)),(這裏的每一層遞歸的b不知道怎麼算,暫時把它當作常數),其空間複雜度爲壓棧最深的時候總的bucket數組所佔內存,棧最大深度爲d,每層遞歸的bucket所佔...而後,這個我算不明白了,但願以後能夠解答計數排序
和桶排序
的思想,而基於這兩種思想的排序都是穩定的,所以基數排序是穩定的