思想:计数排序其实是桶排序的一种特殊情况。所处排序范围是固定的,比如最大值是 k,我们就可以把数据划分成 k 个桶。每个桶内的数据值都是相同的,省掉了桶内排序的时间。这里的k是小于数据总数的。
代码实现
// 计数排序
void countSort(int a[], int n) {
if (n <= 1) {
return;
}
// 求解最大值
int max = a[0];
for(int i = 1; i < n; i++) {
if (max < a[i]) {
max = a[i];
}
}
// 初始化数组, 用来计数
int c[max];
for (int i = 0; i <= max; i++) {
c[i] = 0;
}
// 开始计数, 计算每个桶内的个数
for (int i = 0; i < n; i++) {
c[a[i]]++;
}
// 依次做累加, 实现排序
for (int i = 1; i <= max; i++) {
c[i] = c[i - 1] + c[i];
}
// 临时数组, 用来排序
int r[n];
for (int i = n - 1; i >= 0; i--) {
int index = c[a[i]] - 1;
r[index] = a[i];
c[a[i]]--;
}
// 将临时数组值, 赋值给原始数组
for (int i = 0; i < n; i++) {
a[i] = r[i];
}
}
使用
int a[] = {2, 5, 3, 0, 2, 3, 0 ,3};
int num = sizeof(a) / sizeof(int);
countSort(a, num);
for (int i = 0; i < num; i++) {
printf("%d\n", a[i]);
}
网友评论