C 为什么此计数排序返回输入而不是已排序的表?

C 为什么此计数排序返回输入而不是已排序的表?,c,counting-sort,C,Counting Sort,我在用C写计数排序。N是表中要排序的元素的数量,k是这个元素可以排序的最大值。但是,这段代码留给我的是与输入相同的表。怎么了 void countingSort(int*tab,int n,int k){ int*计数器=(int*)malloc(k*sizeof(int)); int*result=(int*)malloc(n*sizeof(int*); for(int i=0;i

我在用C写计数排序。N是表中要排序的元素的数量,k是这个元素可以排序的最大值。但是,这段代码留给我的是与输入相同的表。怎么了

void countingSort(int*tab,int n,int k){
int*计数器=(int*)malloc(k*sizeof(int));
int*result=(int*)malloc(n*sizeof(int*);
for(int i=0;i
通过指针将tab传递给函数。但是,您需要更改的不是值,而是变量的地址。所以您应该将指针的地址传递给countingSort

void countingSort(int **tab, int n, int k)

通过指针将tab传递给函数。但是,您需要更改的不是值,而是变量的地址。所以您应该将指针的地址传递给countingSort

void countingSort(int **tab, int n, int k)

您的代码中存在一些问题:

  • int*result=(int*)malloc(n*sizeof(int*)使用了不正确的大小。数组元素类型是
    int
    ,而不是
    int*
    。你应该写:

    int *result = (int *)malloc(n * sizeof(int));
    
    或者更好:

    int *result = (int *)malloc(n * sizeof(*result));
    

    注意到,在C中,强制转换是无效的,不同于C++,强制为:

    int *result = malloc(n * sizeof(*result));
    
  • 通过使用
    calloc()
    ,可以避免额外的初始化循环:

  • 一个主要问题是:结果数组永远不会返回给调用方:
    tab=result只修改参数值,而不是调用方的变量。您应该使用
    选项卡
    数组直接存储结果

  • 您没有释放阵列,导致内存泄漏

  • 如果内存不可用,则不会测试分配成功,从而导致未定义的行为。您应该返回一个指示此潜在问题的错误状态

以下是更正的版本:

// assuming all entries in tab are > 0 and < k
int countingSort(int *tab, int n, int k) {
    int *counters = calloc(k, sizeof(*counters));
    if (counters == NULL)
        return -1;
    for (int i = 0; i < n; i++) {
        counters[tab[i]]++;
    }
    int j = 0;
    for (int i = 0; i < k; i++) {
        int tmp = counters[i];
        while (tmp--) {
            tab[j++] = i;
        }
    }
    free(counters);
    return 0;
}
//假设选项卡中的所有条目都是>0和
您的代码中存在一些问题:

  • int*result=(int*)malloc(n*sizeof(int*)使用了不正确的大小。数组元素类型是
    int
    ,而不是
    int*
    。你应该写:

    int *result = (int *)malloc(n * sizeof(int));
    
    或者更好:

    int *result = (int *)malloc(n * sizeof(*result));
    

    注意到,在C中,强制转换是无效的,不同于C++,强制为:

    int *result = malloc(n * sizeof(*result));
    
  • 通过使用
    calloc()
    ,可以避免额外的初始化循环:

  • 一个主要问题是:结果数组永远不会返回给调用方:
    tab=result只修改参数值,而不是调用方的变量。您应该使用
    选项卡
    数组直接存储结果

  • 您没有释放阵列,导致内存泄漏

  • 如果内存不可用,则不会测试分配成功,从而导致未定义的行为。您应该返回一个指示此潜在问题的错误状态

以下是更正的版本:

// assuming all entries in tab are > 0 and < k
int countingSort(int *tab, int n, int k) {
    int *counters = calloc(k, sizeof(*counters));
    if (counters == NULL)
        return -1;
    for (int i = 0; i < n; i++) {
        counters[tab[i]]++;
    }
    int j = 0;
    for (int i = 0; i < k; i++) {
        int tmp = counters[i];
        while (tmp--) {
            tab[j++] = i;
        }
    }
    free(counters);
    return 0;
}
//假设选项卡中的所有条目都是>0和
请将您的问题标题改为比“我的代码有什么问题?”更能描述问题的标题?。也不必重复repat重复您在标记中已经提供的信息;标签足以告诉人们你的文章是关于计数排序的,所以你不需要在标题中重复多次。如果您的标题清楚地解释了一个问题或提出了一个问题,它将帮助您更快地获得答案,而且对于正在扫描试图解决类似问题的搜索结果列表的未来读者更有用。请将您的问题标题设置为比“我的代码出了什么问题”更能描述问题或问题的内容?。也不必重复repat重复您在标记中已经提供的信息;标签足以告诉人们你的文章是关于计数排序的,所以你不需要在标题中重复多次。如果你的标题清楚地解释了一个问题或提出了一个问题,它可以帮助你更快地得到答案,而且对于那些正在浏览搜索结果列表试图解决类似问题的未来读者来说,它更有用。