欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CountSort(计数排序)

程序员文章站 2022-03-02 08:14:05
...

What

计数排序是一种不需要比较的排序,比任何比较的排序都要快。
适用于数组中的值不是特别大的情况,因为需要用空间换时间,所以当数组中的值特别大的时候,空间开销会超级大。从代码中可以明显看出来。

此外,计数排序只能用于正数排序(个人认为负数排序也是可以的)。

Code

const int MAX = 1e3; //初始数组的值,即输入值的数量。
int curr[MAX], final[MAX], count[MAX]; //排序前的数组和排序后的数组,大小一致。注意传参前需要初始化为0, 这里因为是全局变量,所以省略了这一步。
void CountSort(int curr[], int final[], int number) {
    int val = 0;
    for (int i = 0; i < number; i++) {
        count[ curr[i] ]++; //记录每一个数值的数量
        val = val < curr[i] ? curr[i] : val; //寻找最大值
    }
    for (int i = 1; i <= val; i++) { //最大值在这里使用,count可以在找到最大值之前声明,也可以在找到之后声明,如果在之前声明,一定要保证数组的大小大于最大值,以免越界。
        count[i] += count[i-1]; //记录小于等于i的数值的数量,用于‘比较’。即:count[i]的值越大,i越大。
    }
    for (int i = number-1; i >= 0; i--) { //这里为什么可以保证数组大小为 number? 
        count[ curr[i] ]--; // 减一是为了保证final[0]处有值, 同时数组不越界。比如:count[i] 的值为 1时, 应该储存在final[0]处。
        final[ count[ curr[i] ] ] = curr[i]; //存值。
    }
}