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为什么会比数组慢呢,我不知道。