算法:基于分布的排序算法

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
};
原文地址:https://www.cnblogs.com/niconicohang/p/6624146.html