【发布时间】:2012-05-08 07:24:22
【问题描述】:
我一直在研究 std::nth_element 算法,显然:
重新排列范围 [first,last) 中的元素,使 结果第 n 个位置的元素是 在排序序列中的那个位置,没有任何元素 它前面的元素更大,后面的元素都没有 比它小。既不是它前面的元素,也不是元素 跟随它保证被订购。
但是,使用我的编译器,运行以下命令:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for ( int i = 0; i < 10; i++ )
myvector.push_back(rand());
// nth_element around the 4th element
nth_element (myvector.begin(), myvector.begin()+4, myvector.end());
// print results
for (auto it=myvector.begin(); it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
总是以与 std::sort 完全相同的方式返回一个完全排序的整数列表。我错过了什么吗?这个算法有什么用?
编辑:好的,以下使用更大集合的示例表明存在很大差异:
vector<int> myvector;
srand(GetTickCount());
// set some values:
for ( int i = 0; i < RAND_MAX; i++ )
myvector.push_back(rand());
// nth_element around the 4th element
nth_element (myvector.begin(), myvector.begin()+rand(), myvector.end());
vector<int> copy = myvector;
std::sort(myvector.begin(), myvector.end());
cout << (myvector == copy ? "true" : "false") << endl;
【问题讨论】:
-
仅仅因为您的实现似乎对一些简单的示例这样做,并不意味着它总是这样做,也不意味着所有其他实现都这样做。
-
什么编译器,什么库实现?尝试大约 10000 秒的更大数组。
-
在内部使用
sort作为nth_element的别名可以满足正式定义。 -
如您所见here,情况并非总是如此。
-
@AndreasBrinck:但是
sort是 O(n.log(n)),而nth_element需要是 O(n)...
标签: c++