前端算法 === 计数排序

目录

计数排序算法的起源

算法的基本原理

算法的实现

代码示例

算法的优势与局限性

计数排序的应用场景


计数排序是一种简单而高效的排序算法,特别适合于处理一定范围内的整数排序问题。它的核心思想是利用额外的存储空间来记录数组中每个元素出现的次数,然后根据这些计数来重新构建一个有序的数组。以下是对计数排序算法的详细介绍

计数排序算法的起源

计数排序算法最早由H.B.Hoare在1961年提出,它是一种非比较排序算法,与冒泡排序、选择排序等基于比较的排序算法相比,计数排序在特定条件下具有显著的性能优势。

算法的基本原理

计数排序的基本思想可以概括为"计数-累加-分配"三个步骤:

  1. 计数:创建一个计数数组,用于记录每个元素在原始数组中出现的次数。
  2. 累加:将计数数组中的每个元素累加,得到每个元素在排序后数组中的最终位置。
  3. 分配:根据累加后的计数数组,将原始数组中的元素按照排序后的顺序分配到新数组中。

算法的实现

在实现计数排序算法时,我们首先需要确定数组中的最大值,以便确定计数数组的大小。然后,我们遍历原始数组,统计每个元素的出现次数。接下来,我们通过累加计数数组中的元素,确定每个元素在新数组中的位置。最后,我们根据这些位置信息,将原始数组中的元素重新排列到新数组中。

代码示例

复制代码
let arr = [5, 7, 5, 4, 9, 1];

function countSort(arr) {
  // 如果数组长度小于2,则直接返回数组
  if (arr.length < 2) {
    return arr;
  }

  // 找到数组中的最大值
  let max = Math.max(...arr);

  // 创建一个计数数组,长度为最大值加1
  const counts = new Array(max + 1);

  // 遍历原始数组,统计每个元素出现的次数
  arr.forEach((item) => {
    if (!counts[item]) {
      counts[item] = 0;
    }
    counts[item]++;
  });

  // 创建一个新数组来存储排序后的结果
  let newArray = [];
  let SortIndex = 0;

  // 遍历计数数组,根据元素出现的次数,依次填充到新数组中
  counts.forEach((item, index) => {
    while (item > 0) {
      //  可以先使用 SortIndex 的当前值,然后再将 SortIndex 值加1,
      newArray[SortIndex++] = index;
      item--;
    }
  });

  return newArray;
}

console.log(countSort(arr));

算法的优势与局限性

计数排序算法的优势在于其时间复杂度为O(n+k),其中n是数组的长度,k是数组中的最大值。这使得计数排序在处理小范围整数排序时非常高效。然而,计数排序的空间复杂度也是O(k),如果k非常大,算法的空间消耗也会相应增加。

计数排序的应用场景

计数排序算法在以下场景中特别有用:

  • 当数据范围(k)远小于数组长度(n)时。
  • 当需要对固定范围的整数进行排序时。
  • 在数据分布比较均匀的情况下。
相关推荐
w_zero_one14 分钟前
算法--模拟
java·数据结构·算法
秋天的怀念_David39 分钟前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David1 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪1 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪2 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!3 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.3 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净4 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心4 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机
别动我齐刘海5 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人