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]; //存值。
}
}
上一篇: 两种选择排序的实现(堆排序未完成)
下一篇: C#归并排序原理讲解及代码块