STL nth_element排序演算法
阿新 • • 發佈:2018-12-12
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 展示了它的工作方式。
第 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 個元素兩邊元素的順序可能會不同,但它左邊的元素都應該比它大,而右邊的元素都應該比它小。