为什么这段代码在C中的计数排序问题中不起作用?

zengzsys  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(69)
int *countingSort(int arr_count, int *arr, int *result_count)
{
    int i, j, s;
    int *res = (int *)malloc(100 * sizeof(int));  
    for (i = 0; i < arr_count; i++)
    {
        s = arr[i];
        res[s]++;
    }
    return *res;
}

字符串
返回res时也没有得到任何答案。谁能解释一下计数排序的代码?

toe95027

toe950271#

发布的代码没有对数组进行排序,而且分配给malloc()的数组未初始化,因此代码具有未定义的行为。
如果可以假定值在0到99的范围内,则不需要为计数器分配内存。
以下是修改后的版本:

int *countingSort(int arr_count, int *arr, int *result_count)
{
    int count[100] = { 0 };
    *result_count = 0;
    for (int i = 0; i < arr_count; i++) {
        int s = arr[i];
        if (s >= 0 && s < 100)
            count[s]++;
        else
            return NULL;
    }
    int *res = malloc(sizeof(*res) * arr_count);
    if (res != NULL) {
        /* store the sorted numbers */
        for (int i = 0, j = 0; i < 100; i++) {
            while (count[i]-- > 0)
                res[j++] = i;
        }
        *result_count = arr_count;
    }
    return res;
}

字符串

3b6akqbq

3b6akqbq2#

提供的计数排序代码有几个问题:

  1. res数组未初始化为零,从而导致不可预测的行为。
  2. return语句试图返回res的第一个元素的值,而不是指向数组的指针。
    3.未使用或更新result_count参数。
    下面是代码的更正版本:
#include <stdio.h>
#include <stdlib.h>

int* countingSort(int arr_count, int* arr, int* result_count) {
    int i, s;
    int *res = (int*)calloc(100, sizeof(int)); // Allocate and initialize to zero

    for (i = 0; i < arr_count; i++) {
        s = arr[i];
        res[s]++;
    }

    int count = 0;
    for (i = 0; i < 100; i++) {
        if (res[i] > 0)
            count += res[i];
    }
    *result_count = count;

    // Create a new array to store the sorted elements
    int *sorted_arr = (int*)malloc(count * sizeof(int));

    // Traverse the result array and place each element in the sorted array
    int index = 0;
    for (i = 0; i < 100; i++) {
        while (res[i] > 0) {
            sorted_arr[index] = i;
            index++;
            res[i]--;
        }
    }

    return sorted_arr; // Return the pointer to the first element of the sorted_arr array
}

// Example usage
int main() {
    int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
    int n = sizeof(arr) / sizeof(arr[0]);
    int sorted_count = 0;
    int* sorted_arr = countingSort(n, arr, &sorted_count);

    // Print the sorted array
    for (int i = 0; i < sorted_count; i++) {
        printf("%d ", sorted_arr[i]);
    }
    printf("\n");

    free(sorted_arr); // Don't forget to free the dynamically allocated memory
    return 0;
}

字符串
现在,countingSort函数将返回一个已排序的数组。输出将为:

相关问题