计数排序

入门

最简单的非比较排序,适合值域较小的整数数组。

用你自己的数组跑一遍

AlgoAnim · 计数排序
速度
待机
// 源代码
1void countingSort(int arr[], int n) {
2    int maxVal = *max_element(arr, arr + n);
3    int minVal = *min_element(arr, arr + n);
4    int range = maxVal - minVal + 1;
5    vector<int> count(range, 0), output(n);
6
7    for (int i = 0; i < n; i++)
8        count[arr[i] - minVal]++;
9
10    for (int i = 1; i < range; i++)
11        count[i] += count[i - 1];
12
13    for (int i = n - 1; i >= 0; i--) {
14        output[count[arr[i] - minVal] - 1] = arr[i];
15        count[arr[i] - minVal]--;
16    }
17
18    for (int i = 0; i < n; i++)
19        arr[i] = output[i];
20}

复杂度分析

时间 O(n + k)
空间 O(k)
最优 O(n + k)
最坏 O(n + k)

算法讲解

计数排序先统计数组中每个值出现的次数。

然后按值的顺序依次输出,每个值输出其出现次数那么多。

时间复杂度 O(n + k),其中 k 是值域范围。

它是基数排序和桶排序的基础,理解非比较排序的关键。