//绝对映射计数排序
void CountingSort(int* a, int n)
{
int max = a[0];
//遍历找a元素最大值
for (int i = 1; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
}
}
//动态申请a元素最大值+1个sizeof(int)数组并初始化
int* tmp = (int*)calloc(max + 1, sizeof(int));
if (tmp == NULL)
{
perror("malloc fail");
return;
}
//统计a相同元素出现次数
for (int i = 0; i < n; i++)
{
tmp[a[i]]++;
}
//根据统计结果回填a
int j = 0;
for (int i = 0; i < max + 1; i++)
{
while (tmp[i]--)
{
a[j++] = i ;
}
}
}
冬冬的测试代码本鼠也偷偷拿来了:
cpp复制代码
int main()
{
int a[] = { 5,3,5,8,5,9 };
CountingSort(a, sizeof(a) / sizeof(int));
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{
printf("%d ", a[i]);
}
return 0;
}
//相对映射计数排序
void CountingSort(int* a, int n)
{
//遍历a找出最大元素和最小元素
int max = a[0], min = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
}
if (a[i] < min)
{
min = a[i];
}
}
//动态申请a元素数据范围+1个sizeof(int)字节数组并初始化
int* tmp = (int*)calloc(max - min + 1, sizeof(int));
if (tmp == NULL)
{
perror("malloc fail");
return;
}
//统计a相同元素出现次数
for (int i = 0; i < n; i++)
{
tmp[a[i] - min]++;
}
//根据统计结果回填a
int j = 0;
for (int i = 0; i < max - min + 1; i++)
{
while (tmp[i]--)
{
a[j++] = i + min;
}
}
}