返回
计数排序:三分钟内理解并掌握,附带 JS 代码示例!
前端
2024-01-30 18:51:52
什么才是最牛逼的排序算法?
这个问题一直困扰着许多程序员。有人说冒泡排序最简单,有人说快速排序最快,还有人说归并排序最稳定。那么,到底哪种排序算法才是最牛逼的呢?
今天,我就来为大家揭秘这个答案。我要介绍的排序算法叫做计数排序 。它是一种非比较排序算法,也就是说,它不需要比较元素之间的值,而是通过元素的分布来对它们进行排序。
计数排序的原理
计数排序的原理非常简单。它首先创建一个与输入数组大小相同的计数数组。然后,它遍历输入数组,并将每个元素的值作为索引,将计数数组中相应的位置加一。这相当于统计了每个元素出现的次数。
接下来,它再次遍历输入数组,并根据计数数组中的值来确定每个元素在输出数组中的位置。这样,就完成了排序。
计数排序的时间复杂度
计数排序的时间复杂度为 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]
结语
计数排序是一种非常高效的排序算法,它在许多实际场景中都有应用。如果您需要对非负整数进行排序,那么计数排序是一个非常不错的选择。