CountSort(计数排序)

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]; //存值。
    }
}

你可能感兴趣的:(算法与数据结构)