【问题标题】:second smallest element in an array数组中第二小的元素
【发布时间】:2021-01-03 11:42:51
【问题描述】:

作为 C 程序的一部分,我编写了以下函数,它找到数组的第二小元素


unsigned int array_second_min (unsigned int w[], unsigned int n)
{
    unsigned int i, erst = UINT_MAX, zweit = UINT_MAX, count = 0;
    
    if (n < 2)
        return UINT_MAX;
    for (i = 0;i < n; i++) {
        if (w[i] == w[i + 1])
            count++;
    }
    if (count == n - 1)
        return UINT_MAX;
    for (i = 0;i < n;i++) {
        if (w[i] < erst)
            erst = w[i];
    }
    for (i = 0;i < n;i++) {
        if (w[i] == erst)
            continue;
        if ((w[i] - erst) < zweit)
            zweit = w[i];
    }
    return zweit;
}

问题在于它并没有真正发挥应有的作用。我认为问题出在最后一个 for 循环中,但不确定。

感谢您的帮助

输出图片:

【问题讨论】:

  • 你能提供一个失败的例子吗?我无法复制它。
  • 离题:如果你想让别人阅读你的程序,请确保他们理解标识符的含义。主题:您不需要三个循环。只需查看一次数组就足够了。你也不需要任何算术。将两个元素的差异与第三个元素进行比较是完全没有意义的。
  • @dspr 刚刚附上了输出的照片
  • @n.'pronouns'm。一次运行时的逻辑是什么?
  • @Ozk 基本上你只是废弃你的第一个循环并将你的最后两个循环合并为一个。有关详细信息,请参阅您获得的answer

标签: arrays c sorting


【解决方案1】:

以下代码将返回第二小的元素

unsigned int array_second_min (unsigned int w[], unsigned int n){
    unsigned int i, first = UINT_MAX, second = UINT_MAX;
    if(n < 2)
        return UINT_MAX;
    sort(w, w+n);
    second = w[n-2];
    return second;
}

【讨论】:

  • 它似乎只能确定第一个最小元素,但不能确定第二个元素。以数组 1 3 6 2 5 为例
【解决方案2】:

这是一个更有效的解决方案,因为它是O(n)

struct pair {
        int r[2];
};

struct pair small2(int *a, int n) {
        int r[2];
        int order;
        r[0] = a[0];
        r[1] = a[1];
        order = (r[0] >= r[1]);
        for (int i = 2; i < n; i++) {
                if (a[i] <= r[order]) {
                        r[!order] = a[i];
                        order = !order;
                } else if (a[i] <= r[!order]) {
                        r[!order] = a[i];
                }
        }
        struct pair x;
        x.r[0] = r[order];
        x.r[1] = r[!order];
        return x;
}

缺乏关于重复的细节,这以一种不足为奇的方式处理它们。注意order 变量的微妙之处;这是有效的,因为您只对至少两个感兴趣,如果您想要至少 3 个,则必须添加额外的测试。它将保持O(n),但C 会更大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 2022-11-16
    • 2015-01-08
    • 2015-05-23
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多