我正在阅读Accelerated C++。目前,我处于第3章的结尾,这是我要尝试的练习:

“编写程序以计算和打印一组整数的四分位数。”

我找到了第一和第二个四分位数,但是我不知道如何找到第三个四分位数。这是我的代码:

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

 int main(){
    cout<<"Enter numbers:";
    int x;
    vector<int>integers;
    while(cin>>x)
        integers.push_back(x);

    typedef vector<int>::size_type vec_sz;
    vec_sz size = integers.size();
    sort(integers.begin(), integers.end());
    vec_sz mid = size/2;
    vec_sz q1 = mid/2;
    double median;
    median = size % 2 == 0 ? ((double)integers[mid] + (double)integers[mid-1]) / 2
: integers[mid];
    double quartOne = ((double)integers[q1] + (double)integers[q1-1])/2;
    cout<<"The First Quartile is: "<<quartOne<<endl;
    cout<<"The Second Quartile is: "<<median<<endl;
    return 0;
}

最佳答案

一种方法是对集合进行排序,然后采用3个划分项:

vector<int> v = ...;
sort(v.begin(), v.end());
int q12 = v[v.size()*1/4];
int q23 = v[v.size()*2/4];
int q34 = v[v.size()*3/4];

数据项的数量为O(nlogn)。

另一种方法是分别对三个分区的数据执行二进制搜索。例如,提出一个初始q12,通过传递数据来检查它是否正确,如果不正确,则将其向上或向下调整一半,然后重复。对q23和q34同样进行。

从技术上讲,这是O(n),因为32位int具有固定范围,并且可以在最多32个遍中进行二进制搜索。

07-26 04:22