12std::size_t
partition(std::array<T, N>& array, std::size_t left, std::size_t right, std::size_t pivotIndex) {
13 T pivotValue = array[pivotIndex];
14 std::swap(array[pivotIndex], array[right]);
15 std::size_t storeIndex = left;
16 for (std::size_t i = left; i < right; ++i) {
17 if (array[i] < pivotValue) {
18 std::swap(array[i], array[storeIndex]);
22 std::swap(array[storeIndex], array[right]);
33T
quickSelect(std::array<T, N>& array, std::size_t left, std::size_t right, std::size_t k) {
35 const std::size_t pivotIndex = left + (right - left) / 2;
36 const std::size_t pivotNewIndex =
partition(array, left, right, pivotIndex);
37 if (pivotNewIndex == k){
39 }
else if (k < pivotNewIndex){
40 if (pivotNewIndex == 0U) {
43 right = pivotNewIndex - 1;
45 left = pivotNewIndex + 1;