找到数组的最小元素并将其索引设置为0

时间:2016-06-14 21:25:45

标签: c arrays

我正在尝试创建一个C函数,它接受一个数组,找到最小的元素,并将该元素的值设置为零。

到目前为止,这是我的功能。

void find_minimum(double a[], int n) {

    int i, smallest = 0;

    smallest = a[0];

    for (i = 0; i < n; i++) {
        if (a[i] < smallest) {
            smallest = a[i];
        }
        a[i] = 0;
    }
}

当我运行它时,除最后一个之外的每个索引都为零,但我只希望最小的元素为零。

3 个答案:

答案 0 :(得分:2)

您的代码存在一些问题,我很惊讶您的编译器没有爆炸。

void find_minimum(double a[], size_t n) {

  size_t i, index;
  double smallest;

  // sanity check to make sure we're not accessing outside allocated memory
  if (n > 0) {
    smallest = a[0];
    index = 0;
  } else {
    // nothing left to do here
    return;
  }

  // start at 1 because 0 is initial default
  for (i = 1; i < n; i++) {
    if (a[i] < smallest) {
      smallest = a[i];
      index = i;
    }
  }

  // assign only the smallest index
  a[index] = 0.0;
}

如果您有任何问题,请随时发表评论。

答案 1 :(得分:1)

如果我们假设只有一个最小的OP和一些答案,我们也可以跟踪最小的索引,而不是最小的索引,以保持简单:

void find_minimum(double a[], size_t n) {
    if (n <= 0) {
        return;
    }

    size_t smallest = 0;

    for (size_t i = 1; i < n; i++) {
        if (a[i] < a[smallest]) {
            smallest = i;
        }
    }

    a[smallest] = 0.0;
}

答案 2 :(得分:0)

我想解决有多个唯一最小值的情况。

在这种情况下,需要两个循环。一个用于找出整个数组中的最小值,另一个用于将具有该值的所有元素设置为零。

我会跟踪数值在数组中出现的最小和最大索引,以最小化第二个循环的范围:

void set_smallest_to_zero(double a[], size_t n) {

    if ( !a || !n ) {
        return;
    }

    double smallest = a[0];
    size_t min_index = 0,               
           max_index = 0,
           i;

    // find the smallest values
    for ( i = 1; i < n; ++i ) {
        if ( a[i] > smallest ) {
            continue;
        } else if ( a[i] < smallest ) {
            smallest = a[i];
            min_index = i;
            max_index = i;
        } else {                       //  a[i] == smallest
            max_index = i;
        }
    }

    // set to zero all the the minimum values
    for ( i = min_index; i <= max_index; ++i ) {
        if ( a[i] == smallest ) {
            a[i] = 0.0;
        }
    }
}

HERE有一个实例。