【问题标题】:Finding median of an array with C用C查找数组的中位数
【发布时间】:2013-09-17 04:46:33
【问题描述】:

我需要用 C 语言编写一个函数int median(int d[], int size) 来查找数组的中位数。该函数需要调用一个函数void selectsort(int d[], int size),该函数为median() 函数对数组进行排序。只允许median()函数调用selectsort()函数。

如果我需要使用void 返回类型,如何获得从selectsort()median() 的排序数组?我虽然关于使用指针,但这也不起作用,因为指针也需要返回。我不能将selectsort() 嵌套在median() 中。

【问题讨论】:

  • 为什么指针不能对 median 函数起作用的原始数组进行排序?
  • 不知道为什么这被否决了。这是一个非常合理(如果相当初级)的问题。

标签: c arrays function return


【解决方案1】:

大概selectsort 对数组进行了就地排序,破坏了原来的顺序。

在调用selectsort 后,只需将d 传递给median

【讨论】:

  • 我很抱歉,我没有在我的原始帖子中指定(现已澄清):只允许median() 调用selectsort()。我不能自己调用​​selectsort(),所以如果没有返回类型,我将无法将d 传回median()。但是,我对 C 中的内存过程并不是很熟悉,所以这可能根本不是您要说的。
  • 在 C 语言中,您将指向原始数组 d 的指针传递给函数 median()selectsort()。数组d 将被修改,您可以遍历它找到中位数。 selectsort()不需要返回值
【解决方案2】:

当您将非常量指针传递给函数时,您可以让该函数修改指针指向的内容。因此,您的解决方案是将相同的指针传递给两个函数:

int data[] = {1,11,2,12,3,13,4,14};
// Sort the data array
selectsort(data, 8);
// Find the median of the same data array
int m = median(data, size);

只允许median()调用selectsort()

如果是这种情况,并且假设您希望保留原始顺序,您可以像这样复制您的数组:

int median(int d[], int size) {
    int *data = malloc(sizeof(int)*size);
    memcpy(data, d, sizeof(int)*size));
    selectsort(data, 8);
    // Use data to find median
    int med = ...
    free(data);
    return med;
}

这个想法是通过对其副本进行排序来保留原始数组的内容。

【讨论】:

  • 我对 C 语言还是很陌生,所以如果可以的话,有几个后续问题。 data 是指向数组数据的内存位置的指针,对吗?如果这是真的,那么我可以将指向数组的指针作为d[] 的参数传递,使用它作为selectsort() 中的普通数组进行排序,然后在median() 中调用指针,它将引用现在排序的数组?
  • @StevenH 是的,完全正确。同时,从median() 的调用者传递的d 数组将保持不变,因为你从来没有写过它。
  • 说得很有道理,正是我需要了解正在发生的事情。谢谢!
  • 还有一个问题:为什么8传给selectsort()size不应该通过吗?
  • @StevenH 绝对!这就是我复制/粘贴时发生的情况:-(
【解决方案3】:

Selection sort 是一种“就地”排序算法。也就是说,如果你把数组传给 selectsort(),它会使用那个数组作为工作内存,并在函数返回时进行排序。

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 2020-02-25
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2020-12-14
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多