数组中的第k个最大元素

时间:2015-03-02 18:16:44

标签: c++ arrays algorithm

#include <iostream>
#include <cstdlib>
#include <ctime>
#include<algorithm>

using namespace std;

bool findNthMax(double arr[], int len, int n, double& nth_max)
{

sort(arr, arr+n);


//Counter
int c = 1;

//Initialize nth max
nth_max = arr[0];

//Loop in the array while the count is less than (n)
for (int i = 0; i < len && c < n; i++)
{

    if (arr[i] != nth_max)
        c++;


    nth_max = arr[i];

}

return nth_max;

}

int main()
{
int n;
double arr[10];
double y;

cout << "The random array elements are:" << endl;

srand((unsigned)time(0));
for(int i=0; i<10; i++){
    arr[i] = (rand()%100);

    cout << arr[i] << ' ' ;

}

cout << endl;
cout << "Input a positive integer n: " ;
cin  >>  n ;

if(n>10)
cout << "The nth largest value does not exist." << endl;
else
cout << "The nth largest value is: " << findNthMax(arr, 10, n, y) << endl;

return 0;

}

编辑:如果第n个最大值不存在,则该函数返回false;第一个参数是输入数组;第二个参数是数组大小;第三个参数用于将n的值传递给函数;最后 参数是找到的第n个最大值。

main函数生成一个包含10个双随机元素的数组(在[0,99]范围内。它打印出这10个元素。提示用户输入 正整数n,然后打印出第n个最大值 阵列。

我的输出如何显示第n个最大值:1当n = 2

1 个答案:

答案 0 :(得分:1)

您在c之后将if arr[1] != nth_max递增到2。这意味着c !< n,因此您在2次循环后退出for循环。

你需要对整个数组进行排序,b / c你错过了在第二个最大值之前可能有8个副本的情况,例如{8,8,8,8,8,8,8, 8,1,2,8,8,8}。

sort(arr, arr+len);

您应该在数组末尾开始for循环...

nth_max = arr[len-1];    
for (int i = len-1; i >= 0 && c < n; i--)

然后在输出变量y之前运行该函数:

findNthMax(arr, 10, n, y);
cout << "The nth largest value is: " << y << endl;