计数排序不按预期工作

时间:2014-12-16 03:47:57

标签: c sorting

我试图按照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

知道出了什么问题吗?我感觉它是最后一个让它弄乱的循环。

1 个答案:

答案 0 :(得分:3)

这一行错了:

res[temp[numbers[i]]] = numbers[i];

将其更改为:

res[temp[numbers[i]]-1] = numbers[i];

似乎工作正常。