使用C++查找向量的中值

Nic*_*son -2 c++

我是一名编程学生,对于我正在研究的项目,我必须做的事情是计算int值向量的中值,并且必须通过传递函数来完成.也将载体随机地使用C++,其我在code.I'm已经写下随机发生器mt19937为此使用的排序函数和向构件的功能,如最初产生.begin(),.end().size().

我应该确保找到向量的中值,然后输出它

被困了,下面我已经把我的尝试包括在内了.那我哪里错了?如果您愿意给我一些指导或资源以便朝着正确的方向前进,我将不胜感激.

码:

#include<iostream>
#include<vector>
#include<cstdlib>
#include<ctime>
#include<random>
#include<vector>
#include<cstdlib>
#include<ctime>
#include<random>

using namespace std;

double find_median(vector<double>);
double find_median(vector<double> len)
{
    {
        int i;
        double temp;
        int n=len.size();
        int mid;
        double median;
        bool swap;

        do
        {
            swap = false;
            for (i = 0; i< len.size()-1; i++)
            {
                if (len[i] > len[i + 1])
                {
                    temp = len[i];
                    len[i] = len[i + 1];
                    len[i + 1] = temp;
                    swap = true;
                }
            }
        }
        while (swap);

        for (i=0; i<len.size(); i++)
        {
            if (len[i]>len[i+1])
            {
                temp=len[i];
                len[i]=len[i+1];
                len[i+1]=temp;
            }
            mid=len.size()/2;
            if (mid%2==0)
            {
                median= len[i]+len[i+1];
            }
            else
            {
                median= (len[i]+0.5);
            }
        }
        return median;
    }
}
    int main()
    {
        int n,i;

        cout<<"Input the vector size: "<<endl;
        cin>>n;
        vector <double> foo(n);
        mt19937 rand_generator;
        rand_generator.seed(time(0));

        uniform_real_distribution<double> rand_distribution(0,0.8);
        cout<<"original vector: "<<" ";
        for (i=0; i<n; i++)
        {
            double rand_num=rand_distribution(rand_generator);
            foo[i]=rand_num;
            cout<<foo[i]<<" ";

        }
double median;
        median=find_median(foo);

        cout<<endl;

        cout<<"The median of the vector is:  "<<" ";
cout<<median<<endl;
    }
Run Code Online (Sandbox Code Playgroud)

ove*_*eas 8

中位数由.给出

const auto median_it = len.begin() + len.size() / 2;
std::nth_element(len.begin(), median_it , len.end());
auto median = *median_it;
Run Code Online (Sandbox Code Playgroud)

对于偶数(向量的大小),您需要更精确一些.例如,你可以使用

assert(!len.empty());
if (len.size() % 2 == 0) {
    const auto median_it1 = len.begin() + len.size() / 2 - 1;
    const auto median_it2 = len.begin() + len.size() / 2;

    std::nth_element(len.begin(), median_it1 , len.end());
    const auto e1 = *median_it1;

    std::nth_element(len.begin(), median_it2 , len.end());
    const auto e2 = *median_it2;

    return (e1 + e2) / 2;

} else {
    const auto median_it = len.begin() + len.size() / 2;
    std::nth_element(len.begin(), median_it , len.end());
    return *median_it;
}
Run Code Online (Sandbox Code Playgroud)

当然,我们可以通过许多不同的方式获得元素e1.我们也可以使用max或任何我们想要的.但这一行很重要,因为nth_element只有n正确放置第三个元素,其余元素在此元素之前或之后排序,具体取决于它们是大还是小.此范围未分类.

这个代码保证平均具有线性复杂度,即O(N)因此它比sort更渐进地渐近复杂化O(N log N).


关于你的代码:

    for (i=0; i<len.size(); i++){
        if (len[i]>len[i+1])
Run Code Online (Sandbox Code Playgroud)

当您len[len.size()]在最后一次不存在的迭代中访问时,这将不起作用.


Bat*_*eba 5

std::sort(len.begin(), len.end());
double median = len[len.size() / 2];
Run Code Online (Sandbox Code Playgroud)

会做的。如果是偶数,您可能需要取中间两个元素的平均值size(),具体取决于您的要求:

0.5 * (len[len.size() / 2 - 1] + len[len.size() / 2]);
Run Code Online (Sandbox Code Playgroud)

  • `std::nth_element` 比 `std::sort` 具有更好的复杂性。 (2认同)