经典算法

计数排序

又叫桶排序,非比较排序,时间复杂度为O(n+k)

【输入描述】

输入两行。第一行输入数组大小 n ,第二行输入 n 个数字。

【输出描述】

输出一行。输出排序后的数字。

【输入样例】

8
7 13 4 5 8 1 11 9
【输出样例】

1 4 5 7 8 9 11 13
【参考程序】

// 小牛编程
#include <bits/stdc++.h>
using namespace std;

// 计数排序
void countingSort(int arr[], int n) {
    if (n <= 0)
        return;

    // 找到数组中的最大值
    int k = arr[0];
    for (int i = 1; i < n; i++) {
        k = max(k, arr[i]);
    }

    // 创建计数数组,大小为最大值 + 1
    int *cnt = new int[k + 1];
    memset(cnt, 0, (k + 1) * sizeof(int));

    // 统计每个元素出现的次数
    for (int i = 0; i < n; i++) {
        cnt[arr[i]]++;
    }

    // 重新填充排序后的数组
    int j = 0;
    for (int i = 0; i <= k; i++) {
        while (cnt[i] > 0) {
            arr[j++] = i;
            cnt[i]--;
        }
    }
}

int main() {
    int n;
    cin >> n;

    int *arr = new int[n];
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }

    // 计数排序
    countingSort(arr, n);

    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}