#include <stdio.h>
#define M 5
#define maxN 15
void distcount(int a[], int left, int right)
{
int cnt
, b[maxN]; //cnt-> 计数器数组
b[maxN] -> 辅助数组
int i, j;
for (j = 0; j <
M; j++)
cnt[j] = 0;
// 将计数初始化为 0
for (i = left; i <= right; i++)
cnt[a+1]++; // 将二个计数器设置成 0 的个数, 第三个计数器设置成 1 的个数,
// cnt[0]未用 因为小于 0 的键必定是 0 个
for (j = 1; j <
M; j++)
cnt[j] += cnt[j-1];
// 相加得到小于 或 等于 计数对应值键数量
for (i = left; i <= right; i++) // 根据这些索引将键移动到辅助数组 b 中
b[cnt[a]++] = a;
for (i = left; i <= right; i++)
a = b;
}
int main(void)
{
int a[15] = {0,3,3,0,1,1,0,3,0,2,0,1,1,2,0};
int i;
distcount(a, 0, 14);
for (i = 0; i <= 14; i++)
printf("%d ", a);
printf("\n");
return 0;
}
改进版本:
//DistributionCounting 分布计数
int main()
{
int a[7] = {13,11,12,13,12,12,18};
int d[8], s[7];
int i, j;
for (j = 0; j <= 7; j++)
d[j] = 0;
for (i = 0; i < 7; i++)
// 18 - 11 = 7
d[a-11]++;
for(i = 0; i <= 7; i++)
printf("%d ", d);
printf("\n");
for (j = 1; j <= 7; j++)
// j = 1
d[j] = d[j-1] + d[j];
for(i = 0; i <= 7; i++)
printf("%d ", d);
printf("\n");
for (i = 6; i >= 0; i--)
{
j = a-11;
s[d[j]-1] = a;
d[j] = d[j] - 1;
}
for(i = 0; i < 7; i++)
printf("%d ",s);
printf("\n");
return 0;
}
#include <stdio.h>
#define M 5
// 键必须为小于 M 的整数
void distcount(int a[], int left, int right)
{
int cnt[m], b[15]; //cnt[m] -> 计数器数组
b[15] -> 辅助数组
int i, j;
for (j = 0; j <
M; j++)
cnt[j] = 0;
// 将计数初始化为 0
for (i = left; i <= right; i++)
cnt[a+1]++;
// 将二个计数器设置成 0 的个数, 第三个计数器设置成 1 的个数: 6个0, 4个1...
// cnt[0]未用 因为小于 0 的键必定是 0 个
for (j = 1; j <
M; j++)
cnt[j] += cnt[j-1];
// 相加得到小于 或 等于 计数对应值键数量: 小于0的0个, 小于1的6个...
for (i = left; i <= right; i++)
// 根据这些索引将键移动到辅助数组 b 中
b[cnt[a]++] = a;
//cnt[a]++
增加对应键的指针 使其指向下一个要到的位置
//cnt[a]++ 是从左往右放值
//也可以从右往左放值: --cnt[a+1]
for (i = left; i <= right; i++)
//将排序后的文件移回数组到 a 中
a = b;
}
int main(void)
{
int a[15] = {0,3,3,0,1,1,0,3,0,2,0,1,1,2,0};
int i;
distcount(a, 0, 14);
for (i = 0; i <= 14; i++)
printf("%d ", a);
printf("\n");
return 0;
}