C++ 中的sort、partial_sort与nth_element

C++中,一般进行部分排序推荐使用partial_sort,然而,事实并非如此,看看下面的测试程序:

 

#include <vector>
#include <algorithm>
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
 vector<int> vec_sort,vec_partial_sort,vec_nth_element;
 srand((unsigned)time(NULL));
 int a = 0;
 int array_sort[4000],array_partial_sort[4000],array_nth_element[4000];
 clock_t start,end;
 for (unsigned long i = 0; i < 4000; ++i)
 {
  a = rand()%100;
  vec_sort.push_back(a);
  vec_partial_sort.push_back(a);
  vec_nth_element.push_back(a);
  array_sort[i] = a;
  array_partial_sort[i] = a;
  array_nth_element[i] = a;
 }
 start = clock();
 sort(vec_sort.begin(),vec_sort.end());
 end = clock();
 cout << "vector: " << (end - start) << endl;
 start = clock();
 partial_sort(vec_partial_sort.begin(),vec_partial_sort.begin() + 2000,vec_partial_sort.end());
 end = clock();
 cout << "vector partial: " << (end - start) << endl;
 start = clock();
 nth_element(vec_nth_element.begin(),vec_nth_element.begin() + 2000,vec_nth_element.end());
 end = clock();
 cout << "vector nth_element: " << (end - start) << endl;
 start = clock();
 sort(array_sort,array_sort+4000);
 end = clock();
 cout << "array: " << (end - start) << endl;
 start = clock();
 partial_sort(array_partial_sort,array_partial_sort+2000,array_partial_sort+4000);
 end = clock();
 cout << "array partial: " << (end - start) << endl;
 start = clock();
 nth_element(array_nth_element,array_nth_element+2000,array_nth_element+4000);
 end = clock();
 cout << "array nth_element: " << (end - start) << endl;
}

 

输出如下:

vector: 203
vector partial: 2922
vector nth_element: 79
array: 15
array partial: 172
array nth_element: 0

 

测试中,还测试了vector与普通数组的效率,很明显,数组效率要高一些。

相对来说,如果部分排序比率小于10%的话,用partial_sort会有比较好的效果,如果大于!10%还是使用sort进行排序。

而nth_element相对于sort确实有比较高的效率。

vector为什么会比数组慢呢,我不知道。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值