局部排序:
partial_sort(beg,sortEnd,end)
partial_sort(beg,sortEnd,end,op)
1.以上第一种形式,以operator< 对区间[beg,end)内的元素进行排序,使区间[beg,sortEnd)内的元素处于有序状态。
2.以上第二中形式,运用二元判断式:
op(elem1,elem2)
对区间[beg,end)内的元素进行排序,使区间[beg,sortEnd)内的元素处于有序状态。
3.和sort()不同的是,partial_sort()并不对全部元素排序:一旦第一个元素至sortEnd之间的所有元素都排序完毕,就立即停止,不会对剩余的不必要元素进行排序。
4.如果sortEnd和end相等,那么partial_sort()会对整个序列进行排序。平均而言其效率不及sort(),不过以最差情况而论则优于sort()。
运行结果:
运行结果:
partial_sort(beg,sortEnd,end)
partial_sort(beg,sortEnd,end,op)
1.以上第一种形式,以operator< 对区间[beg,end)内的元素进行排序,使区间[beg,sortEnd)内的元素处于有序状态。
2.以上第二中形式,运用二元判断式:
op(elem1,elem2)
对区间[beg,end)内的元素进行排序,使区间[beg,sortEnd)内的元素处于有序状态。
3.和sort()不同的是,partial_sort()并不对全部元素排序:一旦第一个元素至sortEnd之间的所有元素都排序完毕,就立即停止,不会对剩余的不必要元素进行排序。
4.如果sortEnd和end相等,那么partial_sort()会对整个序列进行排序。平均而言其效率不及sort(),不过以最差情况而论则优于sort()。
5.复杂度在线性与nlogn之间。
代码示例:
#include"fuzhu.h"
using namespace std;
int main()
{
deque<int> coll;
INSERT_ELEMENTS(coll,3,7);
INSERT_ELEMENTS(coll,2,6);
INSERT_ELEMENTS(coll,1,5);
PRINT_ELEMENTS(coll,"coll: \n");
partial_sort(coll.begin(),coll.begin()+5,coll.end());
PRINT_ELEMENTS(coll,"partial_sort: \n");
partial_sort(coll.begin(),coll.begin()+5,coll.end(),greater<int>());
PRINT_ELEMENTS(coll,"partial_sort >: \n");
partial_sort(coll.begin(),coll.end(),coll.end());
PRINT_ELEMENTS(coll,"partial_sort: \n");
system("pause");
return 0;
}
运行结果:
partial_sort_copy(sourceBeg,sourceEnd,destBeg,destEnd)
partial_sort_copy(sourceBeg,sourceEnd,destBeg,destEnd,op)
1.两者都是copy()和partial_sort()的组合;
2.它们将元素从源区间(sourceBeg,sourceEnd)复制到目标区间(destBeg,destEnd),同时进行排序;
3.“被排序(被复制)的元素数量”是源区间和目标区间两者所含元素数量的较小值;
4.两者都返回目标区间内“最后一个被复制元素”的下一个位置;
5.如果目标区间(destBeg,destEnd)内的元素数量大于或等于源区间(sourceBeg,sourceEnd)内的元素数量,则所有元素都会被排序并复制,整个行为就相当于copy()和sort()的组合;
6.复杂度:在线性和nlogn之间。
代码示例:
#include"fuzhu.h"
using namespace std;
int main()
{
deque<int> coll1;
vector<int> coll6(6);
vector<int> coll30(30);
INSERT_ELEMENTS(coll1,3,7);
INSERT_ELEMENTS(coll1,2,6);
INSERT_ELEMENTS(coll1,1,5);
PRINT_ELEMENTS(coll1,"coll1: \n");
vector<int>::iterator pos6;
pos6=partial_sort_copy(coll1.begin(),coll1.end(),coll6.begin(),coll6.end());
cout<<"coll6: "<<endl;
copy(coll6.begin(),pos6,ostream_iterator<int>(cout," "));
cout<<endl;
PRINT_ELEMENTS(coll1,"coll1: \n");//可见coll1不变
vector<int>::iterator pos30;
pos30=partial_sort_copy(coll1.begin(),coll1.end(),coll30.begin(),coll30.end(),greater<int>());
cout<<"coll30: "<<endl;
copy(coll30.begin(),pos30,ostream_iterator<int>(cout," "));
cout<<endl;
system("pause");
return 0;
}
运行结果:
分析:
第一次调用partial_sort_copy()时,目标区间内只有6个元素,所以该算法只复制6个元素,返回coll6的终点。第二次调用partial_sort_copy()时,由于coll30有充足的空间,所以coll1的所有元素都被复制并排序。