C++标准库---partial_sort()&partial_sort_copy()

局部排序:

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的所有元素都被复制并排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值