我们在排序的时候,用到的较多的就是sort函数,但是除了sort本身之外,它还有很多兄弟姐妹,用于在特定的环境下实现更专一的功能,效率更高。
partial_sort()
例如对于上百万的数据量进行排序,想要获得其中排位前N位的元素,普遍的做法是将所有数据进行排序,然后取前N位,但是当数据量很大的时候,这种方法需要将所有的元素进行排序效率较低,所以就用到了函数partial_sort,其原型为:
template <class RandomAccessIterator>
void partial_sort (RandomAccessIterator first, RandomAccessIterator middle,
RandomAccessIterator last);
其中排序结果为将first到last之内的元素,其中的first到middle位按序排列,其他位不用管,示例为:
vector<int> array ;
for(int i =1;i<10;++i) array.push_back(i);
random_shuffle(array.begin(), array.end());
cout << "将数组打乱为:" << endl;
for(unsigned int i =0;i<array.size();++i)
cout << array[i] << "," ;
cout << endl;
cout << "partial_sort(参数为(0,3))之后:" << endl;
partial_sort(array.begin(), array.begin()+3, array.end());
for(unsigned int i =0;i<array.size();++i)
cout << array[i] << "," ;
cout << endl;
nth_element()
还有一种情况是,我们只想获得排名第几位的元素,这时候就用到函数nth_element了
其函数原型为:
template <class RandomAccessIterator>
void nth_element (RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last);
此函数在first到last的范围之内,将第nth个参数按照顺序放好,即第nth位为排序后的此位置,而其他元素的顺序并不保证按序排列
示例代码为:
vector<int> array ;
for(int i =1;i<10;++i) array.push_back(i);
random_shuffle(array.begin(), array.end());
cout << "将数组打乱为:" << endl;
for(unsigned int i =0;i<array.size();++i)
cout << array[i] << "," ;
cout << endl;
cout << "nth_element(参数为第三位)之后:" << endl;
nth_element(array.begin(), array.begin()+2, array.end());
for(unsigned int i =0;i<array.size();++i)
cout << array[i] << "," ;
cout << endl;
partition()
另一种情况,想将所有的数据根据某种规则分成两部分,此时需要用的函数partition
他的函数原型是:
template <class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator partition (BidirectionalIterator first,
BidirectionalIterator last, UnaryPredicate pred);
其中第三个参数pred即为想要区分的标准,此函数的排序结果是将所有pred为正的结果放到数列的前部分,其余的元素放到数列的后半部分,但是对于前部分和后部分单独来说是无序的。
示例代码为:
bool is_odd (const int &a) {
return a%2;
}
int main()
{
vector<int> array ;
for(int i =1;i<10;++i) array.push_back(i);
random_shuffle(array.begin(), array.end());
cout << "将数组打乱为:" << endl;
for(unsigned int i =0;i<array.size();++i)
cout << array[i] << "," ;
cout << endl;
cout << "partition(使用is_odd函数比较)之后:" << endl;
partition(array.begin(), array.end(), is_odd);
for(unsigned int i =0;i<array.size();++i)
cout << array[i] << "," ;
cout << endl;
}