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


    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
    };
  • 相关阅读:
    usb 安装系统
    跨站请求伪造攻击的基本原理与防范
    解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND
    我知道
    MAC 重置MySQL root 密码
    线性变换与独立观察的期望和方差
    最小二乘法
    卡方检验中自由度的计算
    关于置信水平,求区间的简便算法
    独立观察与线性变换方差 均值计算
  • 原文地址:https://www.cnblogs.com/niconicohang/p/6624146.html
Copyright © 2020-2023  润新知