在C中修剪用于桶排序的int数组

时间:2013-07-31 20:37:00

标签: c arrays sorting

我正在用C编写一个桶分类程序。在我将小桶合并到一个大桶中之后,我需要删除用小块桶填充的-1s。

我对C很新,所以我可以忽略一个非常简单的解决方案。

这是我的解决方案,它似乎返回一个带有1个尾随垃圾值和尾随0的数组,它填充数组,直到它是未修剪的存储桶的大小(其中所需的结果是没有-1s的桶,垃圾值,并且尾随0。)。

    // A function to trim a bucket of a given size to a bucket containing no -1s
    int* trimBucket(int* bucket, int size)
    {
        int n = 0, i = 0;
        int* newBucket;

        // This loop is to count the number of elements between 0 and 9999
        for(n = 0; n < size; n++) 
        {
            if(bucket[n] != -1 && bucket[n] < 10000)
                i++;
        }

        // Create a new bucket equal to the number of elements counted
        // Filled with -2 to differentiate from -1s contained in the bucket array
        newBucket = allocateAndInitiateOneD(i, -2); 
        i = 0;

        for(n = 0; n < size; n++)
        {
            // I only want values between 0-9999 to be put into the new array
            if(bucket[n] != -1 && bucket[n] < 10000) 
            {
                newBucket[i] = bucket[n];
                i++;
            }       
        }

        free(bucket); // Am I doing this right?
        return newBucket;
    }

allocateAndInitiateOneD函数:

    // A function to allocate memory for a one dimensional array and fill it with the given value
    int* allocateAndInitiateOneD(int x, int initialNum)
    {
        int runs = 0;
        int* oneArray;

        oneArray = malloc(sizeof(int) * x);

        for(runs = 0; runs < x; runs++)
            oneArray[runs] = initialNum;

        return oneArray;
    }

有人可以帮助我理解我做错了什么以及如何获得理想的结果?

感谢您的帮助!

编辑:我正在Unix系统上编译和运行。可能不相关,但这是一个使用MPI库的多处理程序(这似乎不是问题所在。)

1 个答案:

答案 0 :(得分:1)

看起来一切正常,但你需要从这个函数返回新的大小,不知道数组的长度,你可以在新选择的大小的末尾阅读它看起来像垃圾(1个尾随垃圾值和全部为零......)。

C中的数组总是有两个部分。启动指针和大小。有时大小是隐含的,但它需要以某种方式存在,或者你只是永远阅读。

如果您需要从函数返回多个内容,请执行以下操作:

  • 通过指针参数
  • 返回(一个或两个)
  • 通过结构
  • 返回它们