我试图按照CLRS书的规定实施计数排序。我的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
void counting_sort(int numbers[], int k, int len)
{
int *temp = malloc(k*sizeof(int));
int *res = malloc(len*sizeof(int));
int i;
for(i = 0; i < k; i++)
{
temp[i] = 0;
}
for(i = 0; i < len; i++)
{
temp[numbers[i]]++;
}
for(i = 1; i < k; i++)
{
temp[i] += temp[i-1];
}
int j;
for(i = len-1; i >= 0; i--)
{
res[temp[numbers[i]]] = numbers[i];
temp[numbers[i]]--;
}
for(j = 0; j < len; j++)
printf("%d ", res[j]);
printf("\n");
free(temp);
free(res);
}
void main()
{
int numbers[] = {2, 5, 3, 0, 2, 3, 0, 3};
counting_sort(numbers, 6, 8);
}
但我得到的输出是:0 0 0 2 2 3 3 3
。输出几乎是正确的,我应该得到0 0 2 2 3 3 3 5
。
知道出了什么问题吗?我感觉它是最后一个让它弄乱的循环。
答案 0 :(得分:3)
这一行错了:
res[temp[numbers[i]]] = numbers[i];
将其更改为:
res[temp[numbers[i]]-1] = numbers[i];
似乎工作正常。