返回

计数排序:三分钟内理解并掌握,附带 JS 代码示例!

前端

什么才是最牛逼的排序算法?

这个问题一直困扰着许多程序员。有人说冒泡排序最简单,有人说快速排序最快,还有人说归并排序最稳定。那么,到底哪种排序算法才是最牛逼的呢?

今天,我就来为大家揭秘这个答案。我要介绍的排序算法叫做计数排序 。它是一种非比较排序算法,也就是说,它不需要比较元素之间的值,而是通过元素的分布来对它们进行排序。

计数排序的原理

计数排序的原理非常简单。它首先创建一个与输入数组大小相同的计数数组。然后,它遍历输入数组,并将每个元素的值作为索引,将计数数组中相应的位置加一。这相当于统计了每个元素出现的次数。

接下来,它再次遍历输入数组,并根据计数数组中的值来确定每个元素在输出数组中的位置。这样,就完成了排序。

计数排序的时间复杂度

计数排序的时间复杂度为 O(n+k),其中 n 是输入数组的大小,k 是输入数组中元素的最大值。这是因为计数排序需要遍历输入数组两次,而每次遍历都需要花费 O(n) 的时间。

计数排序的空间复杂度

计数排序的空间复杂度为 O(n+k),因为需要创建一个与输入数组大小相同的计数数组。

计数排序的稳定性

计数排序是一种稳定的排序算法,也就是说,如果输入数组中存在相等元素,那么这些元素在排序后的输出数组中仍然保持原来的顺序。

计数排序与其他排序算法的比较

计数排序是一种非常高效的排序算法,它在时间复杂度和空间复杂度上都优于冒泡排序、选择排序和插入排序。但是,计数排序也有一个缺点,那就是它只能对非负整数进行排序。

计数排序的应用场景

计数排序在许多实际场景中都有应用,例如:

  • 统计数据分布情况
  • 对数字进行排序
  • 对字符串进行排序
  • 查找最频繁出现的元素
  • 计算元素的频率分布

计数排序的 JS 代码示例

function countingSort(arr) {
  // 创建一个与输入数组大小相同的计数数组
  const countArray = new Array(Math.max(...arr) + 1).fill(0);

  // 统计每个元素出现的次数
  for (let i = 0; i < arr.length; i++) {
    countArray[arr[i]]++;
  }

  // 计算每个元素在输出数组中的位置
  for (let i = 1; i < countArray.length; i++) {
    countArray[i] += countArray[i - 1];
  }

  // 将元素放入输出数组
  const outputArray = new Array(arr.length);
  for (let i = arr.length - 1; i >= 0; i--) {
    outputArray[countArray[arr[i]] - 1] = arr[i];
    countArray[arr[i]]--;
  }

  // 返回输出数组
  return outputArray;
}

// 测试计数排序
const arr = [1, 5, 3, 2, 4];
console.log(countingSort(arr)); // [1, 2, 3, 4, 5]

结语

计数排序是一种非常高效的排序算法,它在许多实际场景中都有应用。如果您需要对非负整数进行排序,那么计数排序是一个非常不错的选择。