在我接触到算法之前,我几乎已经了解了许多 STL 算法std::nth_element
。我被困住了;我不知道它是如何工作的,它确实做到了。
为了教育和理解,有人可以向我解释算法是如何std::nth_element
工作的吗?
std::vector<int> v{ 9, 3, 6, 2, 1, 7, 8, 5, 4, 0 };
std::nth_element(v.begin(), v.begin() + 2, v.end());
for (auto i : v)
std::cout << i << " ";
std::cout << '\n';
输出:
1 0 2 3 6 7 8 5 4 9
- 那么
nth
元素在哪里呢? - 该算法如何以及做什么?
- 它是否进行某种部分排序?
以下是来自 cppreference.com 的一些解释:
nth_element
是一种部分排序算法,它重新排列 [first, last) 中的元素,使得:
- 如果 [first, last) 已排序,则 nth 指向的元素将更改为该位置将出现的任何元素。
- 这个新的第 n 个元素之前的所有元素都小于或等于新的第 n 个元素之后的元素。更正式地说,nth_element 按升序对范围 [first, last) 进行部分排序,以便范围 [first, nth) 中的任何 i 和范围内的任何 j 都满足条件
!(*j < *i)
(对于第一个版本或第二个版本)comp(*j, *i) == false
范围 [nth, last)。如果范围已完全排序,则放置在第 n 个位置的元素正是在该位置出现的元素。nth 可能是结束迭代器,在这种情况下该函数无效。
- 我仍然对此感到困惑。什么是第 n 个元素以及如何实现这样的可能算法?为了教育起见,我模仿了许多 STL 算法。太感谢了!