算法:基于分布的排序算法
1、计数排序:
(1)平均时间复杂度:O(n + k)
(2)最好时间复杂度:O(n + k)
(3)最坏时间复杂度:O(n + k)
(4)空间复杂度:O(k)
(5)稳定性:稳定
(6)JavaScript实现:
function count ( arr ) { var max = Math.max.apply(Math, arr); var min = Math.min.apply(Math, arr); var count = []; var result = []; // 建立计数数组 for(var j = min; j < max + 1; j++){ count.push(0); }; // 遍历原数组,形成原数组元素的频数分布 for(var k = 0, len = arr.length; k < len; k++){ count[ arr[k] ] += 1; }; // 根据计数数组输出排序后的数组 for(var l = 0; l < count.length; l++){ for(var m = 0; m < count[l]; m++){ result.push(l); }; }; return result; };
2、桶排序:
(1)平均时间复杂度:O(n + k)
(2)最好时间复杂度:O(n + k)
(3)最坏时间复杂度:O(n2)
(4)空间复杂度:O(n + k)
(5)稳定性:稳定
(6)JavaScript实现:
function bucket ( arr ) { var max = Math.max.apply(Math, arr); var min = Math.min.apply(Math, arr); var len = arr.length var bucket = []; var result = []; // 遍历原数组,将数组元素归入相应桶内 for(var k = 0; k < len; k++){ index = parseInt(( arr[k] - min ) / len ); bucket[index] = !bucket[index] ? [] : bucket[index]; bucket[index].push( arr[k] ); }; // 根据计数数组输出排序后的数组 for(var l = 0; l < bucket.length; l++){ if (!!bucket[l]) { // 桶排序内部需要使用其他排序来给桶排列 bucket[l].sort(); result.concat( bucket[l] ); }; }; return result; };
3、基数排序:
(1)平均时间复杂度:O(n*k)
(2)最好时间复杂度:O(n*k)
(3)最坏时间复杂度:O(n*k)
(4)空间复杂度:O(n + k)
(5)稳定性:稳定
(6)JavaScript实现:
function base( arr ) { var maxDigit = Math.max.apply(Math, arr).toString().length; var quenes = []; var mod = 10; var dev = 1; for(var b = 0; b < maxDigit; b++, dev *= 10, mod *= 10){ // 将对应元素分配到对应的桶内 for(var i = 0, len = arr.length; i < len; i++){ var bucket = parseInt( (arr[i] % mod) / dev ); quenes[bucket] = !quenes[bucket]?[]:quenes[bucket]; quenes[bucket].push( arr[i] ); }; // 输出本趟排序结果 var index = 0; for(var i = 0; i < quenes.length; i++){ if (quenes[i] instanceof Array && quenes[i].length > 0) { for(var j = 0,len = quenes[i].length; j < len; j++){ arr[index++] = quenes[i].shift(); }; }; }; }; return arr };