実際にソートしながら試す。
map< vector<int>, double > memo;
class QuickSort {
public:
double getEval(vector <int> L)
{
if (L.size() < 2) return 0;
if (memo.count(L)) return memo[L];
double e = 0;
for (int i = 0; i < L.size(); ++i) {
int p = L[i];
vector<int> small;
vector<int> large;
for (int j = 0; j < L.size(); ++j) {
if (L[j] < p) small.push_back(L[j]);
if (p < L[j]) large.push_back(L[j]);
}
int cost = 0;
for (int j = 0; j < i; ++j) {
if (p < L[j]) ++cost;
}
for (int j = i + 1; j < L.size(); ++j) {
if (L[j] < p) ++cost;
}
e += (double)(getEval(small) + getEval(large) + cost) / L.size();
}
return memo[L] = e;
}
};