簡體   English   中英

數組中第二小的元素

[英]second smallest element in an array

作為 C 程序的一部分,我編寫了以下 function,它找到數組的第二小的元素


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 循環中,但對此不確定。

謝謝您的幫助

output 的圖片:

在此處輸入圖像描述

以下代碼將返回第二小的元素

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;
}

這是一個更有效的解決方案,因為它是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會更大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM