如何对矢量进行排序以找到中位数和模式?

时间:2016-02-07 16:16:50

标签: c++ sorting vector

我必须找到一种方法来对我的矢量进行排序,这样数字就是为了计算数据的模式和中位数。我不知道如何实现它。我尝试对我的矢量进行排序,但是当我显示它时,它仍然按照以前的顺序排列。我的任务是获得x的两个极值,并在这些边界内计算20个增量。然后我将这些数字放入一个等式中并计算这些值并将这些值连续存储在一个向量中。然后我必须找到最大/最小,中位数,模式,范围和平均值。我找到了一种计算除模式和中位数之外的所有方法,我认为该向量需要进行排序。任何帮助尝试找到中位数和模式也是值得赞赏的。

#include <iostream>
#include <iomanip>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;


int main()
{
   double xmin, xmax;
   const int POINTS = 20;
   const double PI = 3.1416;
   double increments;
   int counter = 0;
   double range, mean;
   double total = 0;

   vector<vector<double> > values;

   cout << "Enter in a value for the minimum x value: ";
   cin >> xmin;
   cout << "Enter in a value for the maximum x value: ";
   cin >> xmax;

   if (xmin < 0)
      increments = (abs(xmin) + xmax) / POINTS;
   else
      increments = (xmax - xmin) / POINTS;

   double x = xmin + increments * counter;
   double min = 0.0572 * cos(4.667 * x) + 0.0218 * PI * cos(12.22 * x);
   double max = 0.0572 * cos(4.667 * x) + 0.0218 * PI * cos(12.22 * x);

   cout << setw(15) << "x |" << setw(15) << "f(x)" << endl;
   cout << setw(32) << setfill('-') << " " << endl;
   cout << setfill(' ');
   vector<double> auxiliar;

   while (x <= xmax)
   {
      auxiliar.resize(2);
      auxiliar[0] = x;
      auxiliar[1] = 0.0572 * cos(4.667 * x) + 0.0218 * PI * cos(12.22 * x);

      values.push_back(auxiliar);
      auxiliar.clear();

      if (0.0572 * cos(4.667 * x) + 0.0218 * PI * cos(12.22 * x) > max)
         max = 0.0572 * cos(4.667 * x) + 0.0218 * PI * cos(12.22 * x);

      if (0.0572 * cos(4.667 * x) + 0.0218 * PI * cos(12.22 * x) < min)
         min = 0.0572 * cos(4.667 * x) + 0.0218 * PI * cos(12.22 * x);
      counter++;
      x = xmin + increments * counter;

   }

   for (vector<double> auxiliar : values)
      cout << fixed << showpos << setw(15) << setprecision(2) << auxiliar[0]    << setw(15) << setprecision(4) << auxiliar[1] << endl;

   cout << endl;
   range = max - min;
   for (vector<double> auxiliar : values)
   {
      total += auxiliar[1];
   }

   mean = total / POINTS;

   sort(auxiliar.begin(), auxiliar.end());

   cout << "The maximum value is: " << max << endl;
   cout << "The minumum value is: " << min << endl;
   cout << "The range is: " << range << endl;
   cout << "The mean value is: " << mean << endl;
   cout << "The median value is: " << endl;
   cout << "The mode value is: " << endl;


   system("pause");
   return 0;
}

2 个答案:

答案 0 :(得分:1)

有一个非常简单的std函数可以为你提供数组的中位数:std :: nth_element。

基本上,如果你想获得中位数,你可以这样做:

usetex: True

此示例直接取自文档:http://en.cppreference.com/w/cpp/algorithm/nth_element

要查找模式,您可以先对矢量进行排序并遍历数组。由于排序,这将在O(nlog(n))中。由于它们是排序的,因此相同的元素彼此相邻,因此很容易看到复制最多的位置。

答案 1 :(得分:0)

查找集合中值的方法取决于它是否具有奇数或偶数个元素。在您的情况下,该集合为vector,其当前元素的数量为size()

#include <algorithm>
#include <cmath>
#include <vector>

std::vector<double> vec {1,2,3,4};

std::sort(vec.begin(), vec.end());

double median;
unsigned int size = vec.size();

if(size % 2 != 0) // Then size is odd, and the median is the middle value.
{
    median = vec[floor(size / 2.0)];
}
else // Then size is even, and the median is the mean of the 2 middle values.
{
    median = (vec[size / 2] + vec[size / 2 - 1]) / 2;
}

http://en.cppreference.com/w/cpp/algorithm/nth_element中的代码示例只能找到中位数,如果向量的大小是奇数,则不是偶数。