计数排序(Counting Sort)
计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
1.算法描述
- 找出待排序的数组中最大和最小的元素;
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
2.动图演示

3.代码实现
| |
| function countingSort(arr, maxValue) { |
| var bucket = new Array(maxValue+1), |
| sortedIndex = 0; |
| arrLen = arr.length, |
| bucketLen = maxValue + 1; |
| |
| for (var i = 0; i < arrLen; i++) { |
| if (!bucket[arr[i]]) { |
| bucket[arr[i]] = 0; |
| } |
| bucket[arr[i]]++; |
| } |
| |
| for (var j = 0; j < bucketLen; j++) { |
| while(bucket[j] > 0) { |
| arr[sortedIndex++] = j; |
| bucket[j]--; |
| } |
| } |
| |
| return arr; |
| } |
| |
| public class CountingSort implements IArraySort { |
| |
| @Override |
| public int[] sort(int[] sourceArray) throws Exception { |
| |
| int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); |
| |
| int maxValue = getMaxValue(arr); |
| |
| return countingSort(arr, maxValue); |
| } |
| |
| private int[] countingSort(int[] arr, int maxValue) { |
| int bucketLen = maxValue + 1; |
| int[] bucket = new int[bucketLen]; |
| |
| for (int value : arr) { |
| bucket[value]++; |
| } |
| |
| int sortedIndex = 0; |
| for (int j = 0; j < bucketLen; j++) { |
| while (bucket[j] > 0) { |
| arr[sortedIndex++] = j; |
| bucket[j]--; |
| } |
| } |
| return arr; |
| } |
| |
| private int getMaxValue(int[] arr) { |
| int maxValue = arr[0]; |
| for (int value : arr) { |
| if (maxValue < value) { |
| maxValue = value; |
| } |
| } |
| return maxValue; |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?