计数排序

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

Description

计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N)。

计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

2.1 算法描述

  • 找出待排序的数组中最大和最小的元素;
  • 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  • 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  • 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
#include <iostream>
using namespace std;
const int MAXN = 100000;
const int k = 1000; // range(范围)
int a[MAXN], c[MAXN], r[MAXN];//  c数组用来计数, 
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> a[i]; 
        ++c[a[i]];    //计数 
    }
    for (int i = 1; i < k; i++)   //c[i]前缀和,得到i在排序后序列中的位置为c[i] 
        c[i]+= c[i-1];
    for (int i = n-1; i >=0; i--)   //反向倒填 
        -------//
    for (int i = 1; i <=n; ++i)
        cout << r[i] <<endl;
    return 0;
}

Input Format

一个n,接下来n个整数m( 0<m<100000)

Output Format

从小到大输出n个数,以空格隔开
6
1 89 5 6 23 5
1 5 5 6 23 89

Source

排序

2025寒假冬令营

未参加
状态
已结束
规则
IOI
题目
63
开始于
2025-1-16 9:00
结束于
2025-2-18 17:00
持续时间
800 小时
主持人
参赛人数
23