跳转至

排序——计数排序

计数排序是一种稳定的排序方法,它能在线性时间O(n + k)内对包含n个元素的数组进行排序,其中数组元素均大于等于0且小于等于k

  • ALDS1_6_A: Counting Sort
#include <bits/stdc++.h>

using namespace std;

vector<int> tmp(10005, 0);
vector<int> seq(2 * 1e6 + 5), help(2 * 1e6 + 5);
int n, maxNum = 0;

ostream & operator<<(ostream & os, const vector<int> & v)
{
    for (int i = 1; i <= n; ++i) {
        os << v[i];
        if (i != n) os << ' ';
    }
    os << endl;
    return os;
}

void countingSort()
{
    //统计每个数字出现的次数
    for (int i = 0; i < n; ++i) ++tmp[seq[i]];

    //统计小于等于i的数字的个数
    for (int i = 1; i <= maxNum; ++i) tmp[i] += tmp[i - 1];

    //数值写入排序后的数组help,倒序保证稳定性
    for (int i = n - 1; i >= 0; --i) {
        help[tmp[seq[i]]] = seq[i];
        --tmp[seq[i]];
    }
}


int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> seq[i];
        maxNum = max(maxNum, seq[i]);
    }
    countingSort();
    cout << help;

    return 0;
}