gpt4 book ai didi

c++ - 找到四分位数

转载 作者:可可西里 更新时间:2023-11-01 16:56:34 25 4
gpt4 key购买 nike

我写了一个程序,用户可以在其中输入任意数量的值到 vector 中,它应该返回四分位数,但我一直收到“vector 下标超出范围”错误:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <ios>
#include <vector>

int main () {
using namespace std;

cout << "Enter a list of numbers: ";

vector<double> quantile;
double x;
//invariant: homework contains all the homework grades so far
while (cin >> x)
quantile.push_back(x);

//check that the student entered some homework grades
//typedef vector<double>::size_type vec_sz;
int size = quantile.size();

if (size == 0) {
cout << endl << "You must enter your numbers . "
"Please try again." << endl;
return 1;
}

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

int mid = size/2;
double median;
median = size % 2 == 0 ? (quantile[mid] + quantile[mid-1])/2 : quantile[mid];

vector<double> first;
vector<double> third;

for (int i = 0; i!=mid; ++i)
{
first[i] = quantile[i];

}

for (int i = mid; i!= size; ++i)
{
third[i] = quantile[i];
}
double fst;
double trd;

int side_length = 0;

if (size % 2 == 0)
{
side_length = size/2;
}
else {
side_length = (size-1)/2;
}

fst = (size/2) % 2 == 0 ? (first[side_length/2]/2 + first[(side_length-1)/2])/2 : first[side_length/2];
trd = (size/2) % 2 == 0 ? (third[side_length/2]/2 + third[(side_length-1)/2])/2 : third[side_length/2];

streamsize prec = cout.precision();
cout << "The quartiles are" << setprecision(3) << "1st"
<< fst << "2nd" << median << "3rd" << trd << setprecision(prec) << endl;

return 0;

}

最佳答案

代替 std::sort(quantile.begin(), quantile.end()) 一种更便宜的方法是

auto const Q1 = quantile.size() / 4;
auto const Q2 = quantile.size() / 2;
auto const Q3 = Q1 + Q2;

std::nth_element(quantile.begin(), quantile.begin() + Q1, quantile.end());
std::nth_element(quantile.begin() + Q1 + 1, quantile.begin() + Q2, quantile.end());
std::nth_element(quantile.begin() + Q2 + 1, quantile.begin() + Q3, quantile.end());

这不会对整个数组进行排序,而只会对第 4 个四分位数进行“组间”排序。这节省了完整 std::sort 会执行的“组内”排序。

如果您的quantile 数组不大,那么这是一个小的优化。但是 std::nth_element 的缩放行为是 O(N),而不是 O(N log N) std::sort.

关于c++ - 找到四分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11964552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com