第九章 中位数和顺序统计学
1.最大最小值:
template <class T>
pair<T,T> MinMax(T* a,int n)
{
T _min,_max;
if (n <= 0)
{
return make_pair(_min,_max);
}
if (n%2)
{
_min = _max = a[0];
}else
{
if (a[0] < a[1])
{
_min = a[0];
_max = a[1];
}
else
{
_min = a[1];
_max = a[2];
}
}
for (int i = n - 1; i > 1; i -=2)
{
if (a[i] > a[i - 1])
{
if (a[i] > _max)
{
_max = a[i];
}
if (a[i - 1] < _min)
{
_min = a[i - 1];
}
}
else
{
if (a[i - 1] > _max)
{
_max = a[i - 1];
}
if (a[i] < _min)
{
_min = a[i];
}
}
}
return make_pair(_min,_max);
}
2.顺位统计学
template <class T>
T _RandomSelect(T* a,int p,int r,int i)
{
if (p == r)
{
return a[p];
}
int q = RandomizePartition(a,p,r);
int k = q - p + 1;
if (k == i)
{
return a[q];
}
else if (i < k)
{
return _RandomSelect(a,p,q - 1,i);
}
else
{
return _RandomSelect(a,q + 1,r,i - k);
}
}
template <class T>
T RandomSelect(T* a,int n,int i)
{
return _RandomSelect(a,0,n - 1,i);
}
3.改良的顺位统计学:通过对数组中进行分离时的主元素的选择,可以拥有较好的时间复杂性,不过常数因子会很大。