学习《STL源码剖析》p354时,发现STL中已有partition函数,这不禁让人联想到c语言实现的快排:
int Partition(int k[], int low, int high)
{
int point;
point = k[low];
while( low < high )
{
while( low < high && k[high] >= point )
{
high--;
}
swap(k, low, high);
while( low < high && k[low] <= point )
{
low++;
}
swap(k, low, high);
}
return low;
}
结合STL中的原型,我们很容易就想到使用partition(vector.begin(),vector.end(),func1());来完成,其中func1是判断vector中元素是否满足某条件所用的判断函数,一般来说该函数是个仿函数,然而仿函数在这个情形下显然又是不好接受参数的,那么我们该怎么办呢??
实际上STL考虑到这点,可以使用bind2nd函数来完成这种事情,因此partition函数的使用可以如下:
typedef vector <int>::iterator Iter;
vector <int> V;
void qsort(Iter left,Iter right)
{
if(left>=right) return ;
Iter mid=left;
mid=partition(left+1,right,bind2nd(less <int>(),*mid));
iter_swap(mid-1,left);
qsort(left,mid-1);
qsort(mid,right);
}