• 计数排序


    function countingSort(arr) {
        const countArr = [], resultArr = [];
        for (let i = 0, len = arr.length; i < len; i ++) {
            countArr[arr[i]] = countArr[arr[i]] ? countArr[arr[i]] + 1 : 1;
        }
        for (let i = 0, len = countArr.length; i < len; i ++) {
            countArr[i] = toNumber(countArr[i]) + toNumber(countArr[i - 1]);
        }
        for (let i = arr.length - 1; i >= 0; i--) {
            resultArr[countArr[arr[i]] - 1] = arr[i]; // 减1是因为js数组下标从0开始
            countArr[arr[i]] = countArr[arr[i]] - 1;
        }
        return resultArr;
    }
    function toNumber(obj) {
        return obj ? Number(obj) : 0;
    }

    浏览器测试

     原理解析

      以数组 arr = [3, 4,2,3] 为例

    • 第一个for循环将每个数的大小出现次数记录下来,大小为countArr的下标,countArr[下标]的值为次数;

        结果:[0, 0, 1, 2, 1];

    • 第二个for循环,将小于该值的个数记录下来,结果为arr的每个数都在countArr的下标,countArr的值为小于等于该数的个数

          结果为 [0, 0, 1, 3, 4],小于等于0的个数为0,小于等于1的个数为0,小于等于2的个数为1。。。

    • 第三个for循环,将arr的每个数写入result的正确位置,位置有countArr的值来确定
      • 第一次循环, arr[3] = 3; countArr[arr[3]] = countArr[3] = 3; resultArr[2] = arr[3] = 3; 同时countArr[3] = 3 - 1 = 2;
      • 第二次循环, arr[2]  = 2, countArr[arr[2]] = countArr[2] = 1; resultArr[0] = arr[2] = 2; 同时countArr[2] = 2 - 1 = 1;
      • 第四次循环, arr[1] = 4, countArr[arr[1]] = countArr[4] = 4; resultArr[3] = arr[1] = 4; 同时countArr[4] = 4 - 1 = 3;
      • 第五次循环, arr[0] = 3, countArr[arr[0]] = countArr[3] = 2; resultArr[ 1] = arr[0] = 3; 同时countArr[3] = 2 - 1 = 1;

      最终结果 [2, 3, 3, 4]

    总结

      计算排序分为三步

    • 第一步是将每个数的大小和次数记录在一个新的数组;
    • 第二步将新的数组处理成每个数的在最终结果数组的最大下标(下标从1开始),如上,3的最大下标为3,4的最大下表为4,2的最大下标为1;
    • 第三步是将新的数组写入结果数组,每写一次,最大下标减一,最终达到想要的结果
  • 相关阅读:
    MySQL实战45讲学习笔记:第二十四讲
    MySQL实战45讲学习笔记:第二十六讲
    MySQL实战45讲学习笔记:第二十三讲
    MySQL实战45讲学习笔记:第二十一讲
    MySQL实战45讲学习笔记:第二十二讲
    MySQL实战45讲学习笔记:第十七讲
    MySQL实战45讲学习笔记:第十四讲
    MySQL实战45讲学习笔记:第十三讲
    Web协议详解与抓包实战:HTTP1协议-内容协商是怎样进行的(8)
    Web协议详解与抓包实战:HTTP1协议-请求与响应的上下文(7)
  • 原文地址:https://www.cnblogs.com/tysonlee/p/12100825.html
Copyright © 2020-2023  润新知