1. 程式人生 > >STL nth_element排序演算法

STL nth_element排序演算法

nth_element() 演算法和 partial_sort() 不同。應用的範圍由它的第一個和第三個引數指定。第二個引數是一個指向第 n 個元素的迭代器。如果這個範圍內的元素是完全有序的,nth_dement() 的執行會導致第 n 個元素被放置在適當的位置。這個範圍內,在第 n 個元素之前的元素都小於第 n 個元素,而且它後面的每個元素都會比它大。演算法預設用 <運算子來生成這個結果。

下面是一個使用 nth_elemen() 的示例:

std::vector<int> numbers {22, 7, 93, 45, 19, 56, 88, 12, 8, 7, 15, 10};
size_t count {5}; // Index of nth element
std::nth_element(std::begin(numbers), std::begin(numbers) + count, std::end(numbers));

這裡的第 n 個元素是 numbers 容器的第 6 個元素,對應於 numbers[5],圖 1 展示了它的工作方式。

圖 1 nth_element() 演算法的操作
圖1 nth_element()演算法的操作

第 n 個元素之前的元素都小於它,但不必是有序的。同樣,第 n 個元素後的元素都大於它,但也不必是有序的。如果第二個引數和第三個引數相同(元素段的末尾),這時這個演算法是無效的。

正如本章前面的演算法一樣,可以自己定義比較函式作為函式的第 4 個引數:

std::nth_element(std::begin(numbers), std::begin(numbers) + count, std::end(numbers) , std::greater<>());

這裡使用 > 運算子來比較函式,所以第 n 個元素將是元素按降序排列後的第 n 個元素。第 n 個元素之前的元素都大於它,之後的元素都小於它。如果 number 容器中的初始值和之前的一樣,那麼結果為:

45 56 93 88 22 19 10 12 15 7 8 7

在你的系統上,第 n 個元素兩邊元素的順序可能會不同,但它左邊的元素都應該比它大,而右邊的元素都應該比它小。