c++実装「四分位数」アルゴリズム2

2150 ワード

// PE3-2-2--                    
//   :2012-12-19 10:22:34

// PE3-2--         2:
//  n        :
// Q2 n          (Median);
// 1. n    ,  Q2              ,
//    (n-1)/2   ,Q1     (n-1)/2      ,Q3     (n-1)/2     ;
// 2. n    ,  Q2              ,
//   (n-2)/2  ,Q1     (n-2)/2      ,Q3      (n-2)/2      

#include 
#include 
#include 

using std::cin;         using std::endl;
using std::cout;        using std::vector;
using std::sort;

int main()
{
    cout << "        :" << endl;

    vector  intsets;
    short x;

    while (cin >> x)
    {
        intsets.push_back(x);
    }

    //            
    typedef vector::size_type vec_sz;
    vec_sz size = intsets.size();

    //          
    if (size <= 3)
    {
        cout << "         3,    "
                "  3,     !!" << endl;
        return 1;
    }
    //          
    sort(intsets.begin(), intsets.end());

    //          
    vec_sz mid, mid1, mid3;
    double median, median1, median3;

    mid = size / 2;
    //     
    median = size % 2 == 0 ? (intsets[mid] + intsets[mid-1]) / 2.0
                            : intsets[mid];

    mid1 = size % 2 == 0 ? (mid-1)/2 : mid/2;
    mid3 = mid+mid1+1;
    if (size%2 != 0 )
    { //          
        median1 = mid % 2 == 0 ? (intsets[mid1] + intsets[mid1-1]) / 2.0
                               : intsets[mid1];
        median3 = mid % 2 == 0 ? (intsets[mid3] + intsets[mid3-1]) / 2.0
                                : intsets[mid3];

    }
    else
    { //         
        median1 = (mid-1) % 2 == 0 ? (intsets[mid1] + intsets[mid1-1]) / 2.0
                               : intsets[mid1];
        median3 = (mid-1) % 2 == 0 ? (intsets[mid3] + intsets[mid3-1]) / 2.0
                                : intsets[mid3];

    }

    cout << "median1 = " << median1 << endl;
    cout << "median2 = " << median << endl;
    cout << "median3 = " << median3 << endl;


    return 0;
}