C 如何查找数组中第二大的数字,但返回该值出现的最后一个索引?

C 如何查找数组中第二大的数字,但返回该值出现的最后一个索引?,c,arrays,math,C,Arrays,Math,我的实际问题是在数据集中找到频率第二高的数字。我正在初始化一个数组,该数组的大小是数据集中最大的数字,然后每当该数字出现在数据集中时,数组中相应的索引就会递增。如果两个以上的指数共享第二高频率,那么我需要返回较大的指数。我的代码在某些情况下会返回正确的答案,但并非所有情况下都会返回正确答案,而且我在逻辑中很难找到错误 int secondFreq(int data[], int maxNum){ int highest = 0; int secondHighest = 0;

我的实际问题是在数据集中找到频率第二高的数字。我正在初始化一个数组,该数组的大小是数据集中最大的数字,然后每当该数字出现在数据集中时,数组中相应的索引就会递增。如果两个以上的指数共享第二高频率,那么我需要返回较大的指数。我的代码在某些情况下会返回正确的答案,但并非所有情况下都会返回正确答案,而且我在逻辑中很难找到错误

int secondFreq(int data[], int maxNum){
    int highest = 0;
    int secondHighest = 0;
    int x;

    for(x = 0; x < maxNum; x++){
        if(data[x] > data[highest]){
            secondHighest = highest;
            highest = x;
        }
        else if (data[x] > data[secondHighest]){
            secondHighest = x;
        }
        else if (data[x] == data[secondHighest]){
            secondHighest = x;
        }
    }

    return secondHighest + 1;
}

在您的示例中,第二个'6'(索引11)将转到'else if(data[x]>data[secondHighest]),并将'secondHighest'更新为与'highest'相同。此逻辑无法处理存在多个最高值的情况。 要修复此问题,可以在其他“else if”(data[x]==data[highest])之前放置一个“else if”(数据[x]==data[highest])

但是,如果您的数据集如下所示,您将获得另一个不正确的anwser:

0 - 2
1 - 2
2 - 5
int secondFreq(int data[], int maxNum){
    int secondLargestValue = findsecondLargestValue(data);
    return findIndexofValue(data, secondLargestValue) + 1;
}

int findsecondLargestValue(int data) {
    ...
}

int findIndexofValue(int data, int value) {
    ...
}
我将更改代码,使其更清晰易读,如下所示:

0 - 2
1 - 2
2 - 5
int secondFreq(int data[], int maxNum){
    int secondLargestValue = findsecondLargestValue(data);
    return findIndexofValue(data, secondLargestValue) + 1;
}

int findsecondLargestValue(int data) {
    ...
}

int findIndexofValue(int data, int value) {
    ...
}

如果不是出于2次通过的效率考虑(因此这不是最佳答案),我想说:

int secondFreq(int data[], int maxNum)
{
    double          highestVal = data[0];   // start with the first
                        // entry
    int             secondHighest = -1; // will send back 0 if everything
                    // ties for first
    int             x;      // for loop index

    for (x = 1; x < maxNum; x++) {
    if (data[x] > highestVal) {
        highestVal = data[x];
    }
    };
    for (x = 1; x < maxNum; x++) {
    if (data[x] != highestVal)
        &&((secondHighest == -1) || (data[x] >= data[secondHighest])) {
        secondHighest = x;
        }
    }


    return secondHighest + 1;
}
int secondFreq(int data[],int maxNum)
{
double highestVal=data[0];//从第一个开始
//入口
int secondHighest=-1;//如果
//先打领带
int x;//用于循环索引
对于(x=1;x最高值){
highestVal=数据[x];
}
};
对于(x=1;x=数据[次高]){
次高=x;
}
}
返回最高+1;
}

更难搞乱,尽管它确实检查了两次。

您的代码有两个问题:

  • 您需要设置
    highest=x
    数据[x]==数据[highest]
    的情况下
  • secondHighest
    最初应处于挂起状态
  • 以下是一个示例修改:

    int secondFreq(int data[], int maxNum){
        int highest = 0;
        int secondHighest, secondFlag = 0;//secondFlag : Whether secondHighest has been determined, 0 : undetermined, 1(Not 0) : determined
        int x;
    
        for(x = 1; x < maxNum; x++){
            if(data[x] > data[highest]){
                secondHighest = highest;
                highest = x;
                secondFlag = 1;
            }
            else if (data[x] == data[highest]){
                highest = x;
            }
            else if (secondFlag == 0 || data[x] >= data[secondHighest]){
                secondHighest = x;
                secondFlag = 1;
            }
        }
    
        if(secondFlag)
            return secondHighest + 1;
        else
            return 0;//All elements same
    }
    
    int secondFreq(int data[],int maxNum){
    int最高=0;
    int secondHighest,secondFlag=0;//secondFlag:是否已确定secondHighest,0:未确定,1(不是0):已确定
    int x;
    对于(x=1;x数据[最高]){
    第二高=最高;
    最高=x;
    secondFlag=1;
    }
    else if(数据[x]==数据[最高]){
    最高=x;
    }
    else if(secondFlag==0 | | data[x]>=data[secondHighest]){
    次高=x;
    secondFlag=1;
    }
    }
    如果(第二个标志)
    返回最高+1;
    其他的
    返回0;//所有元素都相同
    }
    
    使用调试器逐步完成该函数,调试器应该会告诉您变量何时错误。为什么在返回它时要将1添加到
    第二高的
    中?您可以使用
    =
    组合第二和第三个
    if
    。您能给出一个产生错误结果的输入示例吗?您需要
    else if(data[x]==data[highest]){highest=x;}
    。我做了更改以添加新的elseif语句。然后我尝试了您提供的数据集,我的函数返回了2(第一个索引+1),这将是正确的答案。我对代码所做的另一个更改是未初始化secondHighest。如果第二个else if从未执行,则此操作将失败。这发生在上面答案中指出的数据集中:(0-2)-(1-2)-(2-5)可能我遗漏了什么。我现在AFK,所以我回家后会检查。发现了错误!我刚刚错过了您在第一个if语句中将第二个标志设置为1的消息。它现在运行良好。感谢您帮助我解决此问题。