void SC_Statistics::CalcMedian(SC_DoubleArray& data) { if (nOK == 0) return; if (nOK != data.Size()) { data.Cleanup(); nOK = data.Size(); } // mix before sort to help sort routine SC_Random mix; mix.RandomMix(data); if (!data.Sort(true)) { realResults[soMedian] = nullReal; } else { int midPt = data.Size() / 2; if ((data.Size() % 2) == 1) { // odd entries -- pick middle realResults[soMedian] = data[midPt]; } else { // average possibilities realResults[soMedian] = data[midPt]; realResults[soMedian] += data[midPt - 1]; realResults[soMedian] /= 2.0; } } }