STL之partial_sort排序学习

partial_sort(beg,mid,end)
partial_sort(beg,mid,end,comp)
对mid-beg个元素进行排序,也就是说,如果migd-beg等于42,则该函数将有序次序中的最小值元素放在序列中
的前42个位置。partial_sort完成之后,从beg到mid(但不包括mid)范围内的元素时有序的,已排序范围内没有
元素大于mid之后的元素。未排序元素之间的次序是未指定的。
例如:
有一个赛跑成绩的集合,我们想知道前三名的成绩但并不关心其他名次的次序,可以这样对这个序列进行排序。
partial_sort(scores.begin(),scores.begin()+3,scores.end());


那么paitical_sort的原理是什么呢?是堆排序!
首先创建一个堆,得到最大值。如果要得到次大值,就将头结点去掉,即调用pop_heap(),此时的头结点就是
次大值,可以这样依次得到最大或者最小的几个值!

#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <time.h>
using namespace std;

int rand_int()
{
	return rand()%100;
}

void print(vector<int> &v,const char* s)
{
	cout<<s<<endl;
	copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
	cout<<endl;
}

bool cmp(int &a, int &b)
{
	if(a>b)
		return true;
	return false;
}

class compare{
public:
    bool operator()(const int &a,const int &b)
    {
        if(a<b)
            return true;
        return false;
    }
};

int main()
{
	srand(time(NULL));
	vector<int> v;
	generate_n(back_inserter(v),10,rand_int);
	print(v,"产生10个随机数");

	partial_sort(v.begin(),v.begin()+4,v.end());
	print(v,"局部递增排序");

	partial_sort(v.begin(),v.begin()+4,v.end(),cmp);
	print(v,"局部递减排序");

	partial_sort(v.begin(),v.begin()+4,v.end(),compare());
	print(v,"局部递增排序");

	return 0;
}


通过程序可以看到两次局部递增排序并不相同,因为partial_port不是稳定排序算法。在只需要最大或最小的几个值时,partial_port比其他排序算法快。

partial_sort

接受三个参数,分别是区间的头,中间和结尾。执行后,将前面M(M=中间-头)个元素有序地放在前面,后面的元素肯定是比前面的大,但他

们内部的次序没有保证。有序序列不包括中间参数。

nth_element 
这个函数只真正排序出一个元素来,就是第n个。函数有三个迭代器的输入(当然还可以加上一个谓词),执行完毕后,中间位置指向的元素保证和完全排序后

这个位置的元素一致,前面区间的元素都小于(精确地说,是不大于)后面区间的元素。

所以要得到最大或者最小的20个元素,调用稍有不同。

partial_sort(v.begin(),v.begin()+20,v.end());

nth_element(v.begin(),v.begin()+19,v.end());


其他排序请参看http://blog.csdn.net/xiaoniba10631/article/details/6727045


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值