STL中的排序

STL提供了许多功能强大的排序算法,但是所有的排序算法的参数都具有一个范围[begin, end]。

这里是使用迭代器(iterator),并且是随机访问迭代器(RandomAccessIterator)。

 

比较函数

在介绍具体的算法之前,先要了解一下STL排序算法中的比较函数。

为了使STL排序算法按照你的规则排序,你需要给它指定一个比较函数。如果没有指定,编译器会自行指定为less仿函数。如下:

    vector<int> vect;
    sort(vect.begin(), vect.end());

此时相当于调用:

    sort(vect.begin(), vect.end(), less<int>());


STL还提供了其他仿函数,如下:

equal_to

not_equal_to

less

greater

less_equal

greater_equal

 

当容器中的元素是一些标准类型(int、float、char或string等)时,可以直接使用这些仿函数。但如果容器中的元素是自定义类型或者你需要按照其他的规则排序时,就还需要进行一些额外的处理,有两种方法:

1.自己写比较函数,例如:

bool my_less(const MyClass& c1, const MyClass& c2)
{
    return c1.val < c2.val;
}

 

2.在自定义类型中重载“<”或“>”之类的操作符,例如:

bool operator <(const MyClass& c)
{
    return val < c.val;
}


 

稳定排序

在排序算法中,带有stable字样的,即为稳定排序,意思就是可以保证相等元素的前后位置在排序前后保持不变。

 

sort和stable_sort

参数:first, last, comp

功能:对[first, last]区间内的元素按照comp规则进行全排序。

comp为比较函数,可选,若未指定,默认为less。

sort采用的是成熟的快速排序,目前大部分TL版本已经不是采用简单的快速排序,而是结合内插排序算法。时间复杂度为n*log(n)。

stable_sort采用的是归并排序,分配足够的内存时,其时间复杂度为n*log(n),否则为n*log(n)*log(n)。

 

partial_sort

参数:first, middle, last, comp

功能:在[first, last]区间中,找出符合comp规则的前middle-first+1个元素,排序后放在[first, middle]区间。举例说明就是,100个学生中,找出分数最低的5个人并排好序。

partial_sort采用的是堆排序,任何情况下的时间复杂度都是n*log(n)。

如果希望用partial_sort来实现全排序,只要让middle=last就可以了。

partial_sort_copy其实是partial_sort和copy的组合。

使用示例:

    partial_sort(vect.begin(), vect.begin()+5, vect.end(), less());

 

nth_element

参数:first, nth, last, comp

功能:在[first, last]区间中,找出按照comp规则排序出现在第nth个位置的元素。

该函数只是确保按照comp规则排序后应该出现在第nth个位置的元素出现在该位置,但不保证其他元素的有序性,所以其他元素很可能是杂乱无章的。

使用示例:

    nth_element(vect.begin(), vect.begin()+3, vect.end(), less());

 

partition和stable_partition

参数:first, last, pred

功能:将[first, last]区间中符合pred约束的元素放到前面。

实际上,这两个函数称之为归类函数更为准确。

使用示例:

    student exam("pass", 60);
    stable_partition(vect.begin(), vect.end(), bind2nd(less(), exam));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值